]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
more cleanup and merge of kink code into flow track cuts
authorMikolaj Krzewicki <mkrzewic@localhost.localdomain>
Wed, 29 Jan 2014 16:02:55 +0000 (17:02 +0100)
committerMikolaj Krzewicki <mikolaj.krzewicki@cern.ch>
Fri, 31 Jan 2014 09:44:58 +0000 (10:44 +0100)
PWG/FLOW/Base/AliFlowAnalysisWithScalarProduct.cxx
PWG/FLOW/Base/AliFlowEventSimple.h
PWG/FLOW/Base/AliFlowTrackSimpleCuts.cxx
PWG/FLOW/Base/AliFlowTrackSimpleCuts.h
PWG/FLOW/Tasks/AliAnalysisTaskFlowEvent.h
PWG/FLOW/Tasks/AliFlowEvent.cxx
PWG/FLOW/Tasks/AliFlowEvent.h
PWG/FLOW/Tasks/AliFlowTrackCuts.cxx
PWG/FLOW/Tasks/AliFlowTrackCuts.h

index 075068f680ac2a2a9b09031b6d0b527ed758cb2e..3a8c6449156c904919ee34f3ce43220d4d8fa42d 100644 (file)
@@ -380,7 +380,6 @@ void AliFlowAnalysisWithScalarProduct::Make(AliFlowEventSimple* anEvent) {
     Double_t dPhi = pTrack->Phi();
     Double_t dPt  = pTrack->Pt();
     Double_t dEta = pTrack->Eta();
-    Double_t dMass = pTrack->Mass();
 
     //calculate vU
     TVector2 vU;
index 120a48d28343f187dc32c774af6e48aee5ded6e1..d16695956d6604aa8f08c8d9c7f1750e036a6026 100644 (file)
@@ -50,12 +50,12 @@ class AliFlowEventSimple: public TObject {
   Int_t    NumberOfTracks() const                   { return fNumberOfTracks; }
   Int_t    GetReferenceMultiplicity() const         { return fReferenceMultiplicity; }
   void     SetReferenceMultiplicity( Int_t m )      { fReferenceMultiplicity = m; }
-  Int_t    GetEventNSelTracksRP() const             { return fNumberOfPOIs[0]; } 
-  void     SetEventNSelTracksRP(Int_t nr)           { fNumberOfPOIs[0] = nr; }  
-  Int_t    GetEventNSelTracksPOI() const            { return fNumberOfPOIs[0]; } 
-  void     SetEventNSelTracksPOI(Int_t np)          { fNumberOfPOIs[0] = np; }  
-  Int_t    GetNumberOfRPs() const                   { return fNumberOfPOIs[0]; }
-  void     SetNumberOfRPs( Int_t nr )               { fNumberOfPOIs[0]=nr; }
+  Int_t    GetEventNSelTracksRP() const             { return GetNumberOfPOIs(0); } 
+  void     SetEventNSelTracksRP(Int_t nr)           { SetNumberOfPOIs(nr,0); }  
+  Int_t    GetEventNSelTracksPOI() const            { return GetNumberOfPOIs(1); } 
+  void     SetEventNSelTracksPOI(Int_t np)          { SetNumberOfPOIs(np,1); }  
+  Int_t    GetNumberOfRPs() const                   { return GetNumberOfPOIs(0); }
+  void     SetNumberOfRPs( Int_t nr )               { SetNumberOfPOIs(nr,0); }
   Int_t    GetNumberOfPOIs(Int_t i=1) const         { return (i<fNumberOfPOItypes)?fNumberOfPOIs[i]:0; }
   void     SetNumberOfPOIs( Int_t nubmerOfPOIs, Int_t poiType=1 );
   void     IncrementNumberOfPOIs(Int_t poiType=1);
@@ -102,7 +102,7 @@ class AliFlowEventSimple: public TObject {
   void AddV2( TF1* ptDepV2 );
   void DefineDeadZone( Double_t etaMin, Double_t etaMax, Double_t phiMin, Double_t phiMax );
   Int_t CleanUpDeadTracks();
-  void ClearFast();
+  virtual void ClearFast();
  
   static TF1* SimplePtSpectrum();
   static TF1* SimplePtDepV2();
index 017943f75c1de9206e824a4ae181f1c58cb95d20..6d3ff12d50e1ea59e98dbf6debe0b83a883b119b 100644 (file)
@@ -105,30 +105,30 @@ Bool_t AliFlowTrackSimpleCuts::IsSelected(TObject* obj, Int_t)
   if (p) return PassesCuts(p);
   AliFlowTrackSimple* ts = dynamic_cast<AliFlowTrackSimple*>(obj);
   if (ts) return PassesCuts(ts);
-  return 0; //default when passed a wrong type of object
+  return kFALSE; //default when passed a wrong type of object
 }
 
 //----------------------------------------------------------------------- 
 Bool_t AliFlowTrackSimpleCuts::PassesCuts(const AliFlowTrackSimple *track) const
 {
   //simple method to check if the simple track passes the simple cuts
-  if(fCutPt) {if (track->Pt() < fPtMin || track->Pt() >= fPtMax ) return 0;}
-  if(fCutEta) {if (track->Eta() < fEtaMin || track->Eta() >= fEtaMax ) return 0;}
-  if(fCutPhi) {if (track->Phi() < fPhiMin || track->Phi() >= fPhiMax ) return 0;}
-  if(fCutCharge) {if (track->Charge() != fCharge) return 0;}
-  if(fCutMass) {if (track->Mass() < fMassMin || track->Mass() >= fMassMax ) return 0;}
+  if(fCutPt) {if (track->Pt() < fPtMin || track->Pt() >= fPtMax ) return kFALSE;}
+  if(fCutEta) {if (track->Eta() < fEtaMin || track->Eta() >= fEtaMax ) return kFALSE;}
+  if(fCutPhi) {if (track->Phi() < fPhiMin || track->Phi() >= fPhiMax ) return kFALSE;}
+  if(fCutCharge) {if (track->Charge() != fCharge) return kFALSE;}
+  if(fCutMass) {if (track->Mass() < fMassMin || track->Mass() >= fMassMax ) return kFALSE;}
   //if(fCutPID) {if (track->PID() != fPID) return kFALSE;}
-  return 1;
+  return kTRUE;
 }
 
 //----------------------------------------------------------------------- 
 Bool_t AliFlowTrackSimpleCuts::PassesCuts(TParticle* track) const
 {
   //simple method to check if the simple track passes the simple cuts
-  if(fCutPt)  {if (track->Pt() < fPtMin || track->Pt() >= fPtMax ) return 0;}
-  if(fCutEta) {if (track->Eta() < fEtaMin || track->Eta() >= fEtaMax ) return 0;}
-  if(fCutPhi) {if (track->Phi() < fPhiMin || track->Phi() >= fPhiMax ) return 0;}
-  //if(fCutPID) {if (track->GetPdgCode() != fPID) return 0;}
+  if(fCutPt)  {if (track->Pt() < fPtMin || track->Pt() >= fPtMax ) return kFALSE;}
+  if(fCutEta) {if (track->Eta() < fEtaMin || track->Eta() >= fEtaMax ) return kFALSE;}
+  if(fCutPhi) {if (track->Phi() < fPhiMin || track->Phi() >= fPhiMax ) return kFALSE;}
+  //if(fCutPID) {if (track->GetPdgCode() != fPID) return kFALSE;}
 
   //getting the charge from a tparticle is expensive
   //only do it if neccesary
@@ -136,14 +136,14 @@ Bool_t AliFlowTrackSimpleCuts::PassesCuts(TParticle* track) const
   {
     TParticlePDG* ppdg = track->GetPDG();
     Int_t charge = TMath::Nint(ppdg->Charge()/3.0); //mc particles have charge in units of 1/3e
-    if (charge==fCharge) return 1;
+    return (charge==fCharge);
   }
 
   if (fCutMass) {
     TParticlePDG* ppdg = track->GetPDG();
     if (ppdg->Mass() < fMassMin || ppdg->Mass() >= fMassMax )
-      return 0;
+      return kFALSE;
   }
 
-  return 1;
+  return kTRUE;
 }
index 3986b8666fc0e0a0fa75714c82e5627aca6de9e4..9a82cc08be140e715764e25004db4a31b36e9ade 100644 (file)
@@ -74,7 +74,7 @@ class AliFlowTrackSimpleCuts : public TNamed {
   Bool_t   fCutMass; // cut on mass?
   Double_t fMassMax; //max mass
   Double_t fMassMin; //min mass
-  Int_t    fPOItype; //how many different POI classes do we recognize?
+  Int_t    fPOItype; //which poi type do we produce? (RP=0, POI=1,2,3,4,5...)
 
   ClassDef(AliFlowTrackSimpleCuts,2)
 };
index aba868be4f977b5430ccd514826afb8dd53bd4e3..9ed59b2c720c8204c7cb1cfa54bc438c51cdcf6d 100644 (file)
@@ -60,9 +60,9 @@ class AliAnalysisTaskFlowEvent : public AliAnalysisTaskSE {
 
   void          SetCutsEvent(AliFlowEventCuts* cutsEvent) {fCutsEvent=cutsEvent;}
   AliFlowEventCuts* GetCutsEvent() const {return fCutsEvent;}
-  void          SetCutsRP(AliFlowTrackCuts* cutsRP) {fCutContainer->Add(cutsRP); fCutsRP=cutsRP;}
+  void          SetCutsRP(AliFlowTrackCuts* cutsRP) {fCutContainer->AddAt(cutsRP,0); fCutsRP=cutsRP; cutsRP->SetPOItype(0); }
   AliFlowTrackCuts* GetCutsRP() const {return fCutsRP;} //to be reimplemented
-  void          SetCutsPOI(AliFlowTrackCuts* cutsPOI) {fCutContainer->Add(cutsPOI); fCutsPOI=cutsPOI;}
+  void          SetCutsPOI(AliFlowTrackCuts* cutsPOI) {fCutContainer->AddAt(cutsPOI,1); fCutsPOI=cutsPOI; cutsPOI->SetPOItype(1); }
   AliFlowTrackCuts* GetCutsPOI() const {return fCutsPOI;} //to be reimplemented
 
   void          SetCFManager1(AliCFManager* cfmgr) {this->fCFManager1 = cfmgr; } 
index cc5c546a58043b2a2bffa1b5b1b66c1b709f9b1b..14e0013ed527934f85f55780a50f827e617ec348 100644 (file)
@@ -53,7 +53,7 @@ ClassImp(AliFlowEvent)
 
 //-----------------------------------------------------------------------
 AliFlowEvent::AliFlowEvent():
-  AliFlowEventSimple(), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -72,7 +72,7 @@ AliFlowEvent::AliFlowEvent():
 
 //-----------------------------------------------------------------------
 AliFlowEvent::AliFlowEvent(Int_t n):
-  AliFlowEventSimple(n), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(n), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -89,7 +89,7 @@ AliFlowEvent::AliFlowEvent(Int_t n):
 
 //-----------------------------------------------------------------------
 AliFlowEvent::AliFlowEvent(const AliFlowEvent& event):
-  AliFlowEventSimple(event), fApplyRecentering(event.fApplyRecentering), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(event), fApplyRecentering(event.fApplyRecentering), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // copy constructor 
     for(Int_t i(0); i < 9; i++) {
@@ -112,7 +112,7 @@ AliFlowEvent& AliFlowEvent::operator=(const AliFlowEvent& event)
 
   fApplyRecentering = event.fApplyRecentering; 
   fCachedRun = event.fCachedRun; 
-  fCurrentCentrality = event.fCurrentCentrality;
+  fVZEROcentralityBin = event.fVZEROcentralityBin;
   for(Int_t i(0); i < 9; i++) {
       for(Int_t j(0); j < 2; j++) {
           for(Int_t k(0); k < 2; k++) {
@@ -197,7 +197,7 @@ void AliFlowEvent::SetMCReactionPlaneAngle(const AliMCEvent* mcEvent)
 AliFlowEvent::AliFlowEvent( const AliMCEvent* anInput,
                             const AliCFManager* rpCFManager,
                             const AliCFManager* poiCFManager):
-  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -254,7 +254,7 @@ AliFlowEvent::AliFlowEvent( const AliMCEvent* anInput,
 AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
                             const AliCFManager* rpCFManager,
                             const AliCFManager* poiCFManager ):
-  AliFlowEventSimple(20),  fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20),  fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -314,7 +314,7 @@ AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
 AliFlowEvent::AliFlowEvent( const AliAODEvent* anInput,
                             const AliCFManager* rpCFManager,
                             const AliCFManager* poiCFManager):
-  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -397,7 +397,7 @@ AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
                             KineSource anOption,
                             const AliCFManager* rpCFManager,
                             const AliCFManager* poiCFManager ):
-  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -495,7 +495,7 @@ AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
 AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
                            const AliMultiplicity* anInputTracklets,
                            const AliCFManager* poiCFManager ):
-  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -571,7 +571,7 @@ AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
 AliFlowEvent::AliFlowEvent( const AliESDEvent* esd,
                            const AliCFManager* poiCFManager,
                             Bool_t hybrid):
-  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -665,7 +665,7 @@ AliFlowEvent::AliFlowEvent( const AliESDEvent* esd,
 AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
                            const TH2F* anInputFMDhist,
                            const AliCFManager* poiCFManager ):
-  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(-1), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -702,7 +702,7 @@ AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
       //marking the particles used for the particle of interest (POI) selection:
       if(poiOK && poiCFManager)
        {
-          IncrementNumberOfPOIs(1);
+    IncrementNumberOfPOIs(1);
          pTrack->SetForPOISelection(kTRUE);
          pTrack->SetSource(AliFlowTrack::kFromESD);
        }
@@ -800,24 +800,24 @@ void AliFlowEvent::Fill( AliFlowTrackCuts* rpCuts,
       TObject* particle = rpCuts->GetInputObject(i);
 
       Bool_t rp = rpCuts->IsSelected(particle,i);
-      Int_t poiClass = poiCuts->IsSelected(particle,i);
+      Bool_t poi = poiCuts->IsSelected(particle,i);
 
-      if (!(rp||poiClass>0)) continue;
+      if (!(rp||poi)) continue;
 
       //make new AliFlowTrack
       if (rp)
       {
         pTrack = rpCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
         if (!pTrack) continue;
-        pTrack->TagRP(); IncrementNumberOfPOIs(0);
-        if (poiClass>0) {pTrack->Tag(poiClass); IncrementNumberOfPOIs(poiClass);}
+        pTrack->Tag(0); IncrementNumberOfPOIs(0);
+        if (poi) {pTrack->Tag(1); IncrementNumberOfPOIs(1);}
         if (pTrack->GetNDaughters()>0) fMothersCollection->Add(pTrack);
       }
-      else if (poiClass>0)
+      else if (poi)
       {
         pTrack = poiCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
         if (!pTrack) continue;
-        pTrack->Tag(poiClass); IncrementNumberOfPOIs(poiClass);
+        pTrack->Tag(1); IncrementNumberOfPOIs(1);
         if (pTrack->GetNDaughters()>0) fMothersCollection->Add(pTrack);
       }
       fNumberOfTracks++;
@@ -831,12 +831,12 @@ void AliFlowEvent::Fill( AliFlowTrackCuts* rpCuts,
     for (Int_t i=0; i<poiCuts->GetNumberOfInputObjects(); i++)
     {
       TObject* particle = poiCuts->GetInputObject(i);
-      Int_t poiClass = poiCuts->IsSelected(particle,i);
-      if (poiClass<=0) continue;
+      Bool_t poi = poiCuts->IsSelected(particle,i);
+      if (!poi) continue;
       pTrack = poiCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
       if (!pTrack) continue;
-      pTrack->Tag(poiClass);
-      IncrementNumberOfPOIs(poiClass);
+      pTrack->Tag(1);
+      IncrementNumberOfPOIs(1);
       fNumberOfTracks++;
       if (pTrack->GetNDaughters()>0) fMothersCollection->Add(pTrack);
     }
@@ -845,11 +845,11 @@ void AliFlowEvent::Fill( AliFlowTrackCuts* rpCuts,
     for (Int_t i=0; i<numberOfInputObjects; i++)
       {
       TObject* particle = rpCuts->GetInputObject(i);
-      Int_t rp = rpCuts->IsSelected(particle,i);
-      if (rp<1) continue;
+      Bool_t rp = rpCuts->IsSelected(particle,i);
+      if (!rp) continue;
       pTrack = rpCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
       if (!pTrack) continue;
-      pTrack->TagRP();
+      pTrack->Tag(0);
       IncrementNumberOfPOIs(0);
       fNumberOfTracks++;
       if (pTrack->GetNDaughters()>0) fMothersCollection->Add(pTrack);
@@ -864,19 +864,8 @@ void AliFlowEvent::InsertTrack(AliFlowTrack *track) {
   *pTrack = *track;
   if (track->GetNDaughters()>0)
   {
-    fMothersCollection->Add(track);
+    fMothersCollection->Add(pTrack);
   }
-  //pTrack->SetPt( track->Pt() );
-  //pTrack->SetPhi( track->Phi() );
-  //pTrack->SetEta( track->Eta() );
-  //pTrack->SetWeight( track->Weight() );
-  //pTrack->SetCharge( track->Charge() );
-  //pTrack->SetMass( track->Mass() );
-  //pTrack->SetForRPSelection( track->InRPSelection() );
-  //pTrack->SetForPOISelection( track->InPOISelection() );
-  //if(track->InSubevent(0)) pTrack->SetForSubevent(0);
-  //if(track->InSubevent(1)) pTrack->SetForSubevent(1);
-  //pTrack->SetID( track->GetID() );
   return;
 }
 
@@ -900,7 +889,7 @@ AliFlowTrack* AliFlowEvent::ReuseTrack(Int_t i)
 //-----------------------------------------------------------------------
 AliFlowEvent::AliFlowEvent( AliFlowTrackCuts* rpCuts,
                             AliFlowTrackCuts* poiCuts ):
-  AliFlowEventSimple(20), fApplyRecentering(kFALSE), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(kFALSE), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -915,80 +904,7 @@ AliFlowEvent::AliFlowEvent( AliFlowTrackCuts* rpCuts,
     }
   //Fills the event from a vevent: AliESDEvent,AliAODEvent,AliMCEvent
   //the input data needs to be attached to the cuts
-  //we have two cases, if we're cutting the same collection of tracks
-  //(same param type) then we can have tracks that are both rp and poi
-  //in the other case we want to have two exclusive sets of rps and pois
-  //e.g. one tracklets, the other PMD or global - USER IS RESPOSIBLE
-  //FOR MAKING SURE THEY DONT OVERLAP OR ELSE THE SAME PARTICLE WILL BE
-  //TAKEN TWICE
-
-  if (!rpCuts || !poiCuts) return;
-  AliFlowTrackCuts::trackParameterType sourceRP = rpCuts->GetParamType();
-  AliFlowTrackCuts::trackParameterType sourcePOI = poiCuts->GetParamType();
-
-  if (sourceRP==sourcePOI)
-  {
-    //loop over tracks
-    Int_t numberOfInputObjects = rpCuts->GetNumberOfInputObjects();
-    for (Int_t i=0; i<numberOfInputObjects; i++)
-    {
-      //get input object (particle)
-      TObject* particle = rpCuts->GetInputObject(i);
-
-      Bool_t rp = rpCuts->IsSelected(particle,i);
-      Int_t poiClass = poiCuts->IsSelected(particle,i);
-      
-      if (!(rp||poiClass>0)) continue;
-
-      //make new AliFLowTrack
-      AliFlowTrack* pTrack = NULL;
-      if (rp)
-      {
-        pTrack = rpCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
-        if (!pTrack) continue;
-        pTrack->TagRP(); IncrementNumberOfPOIs(0);
-        if (poiClass>0) {pTrack->Tag(poiClass); IncrementNumberOfPOIs(poiClass);}
-      }
-      else
-      if (poiClass>0)
-      {
-        pTrack = poiCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
-        if (!pTrack) continue;
-        pTrack->Tag(poiClass); IncrementNumberOfPOIs(poiClass);
-      }
-      TrackAdded();
-    }//end of while (i < numberOfTracks)
-  }
-  else if (sourceRP!=sourcePOI)
-  {
-    //here we have two different sources of particles, so we fill
-    //them independently
-    AliFlowTrack* pTrack = NULL;
-    //RP
-    Int_t numberOfInputObjects = rpCuts->GetNumberOfInputObjects();
-    for (Int_t i=0; i<numberOfInputObjects; i++)
-    {
-      TObject* particle = rpCuts->GetInputObject(i);
-      Bool_t rp = rpCuts->IsSelected(particle,i);
-      if (!rp) continue;
-      pTrack = rpCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
-      if (!pTrack) continue;
-      pTrack->TagRP(); IncrementNumberOfPOIs(0);
-      TrackAdded();
-    }
-    //POI
-    numberOfInputObjects = poiCuts->GetNumberOfInputObjects();
-    for (Int_t i=0; i<numberOfInputObjects; i++)
-    {
-      TObject* particle = poiCuts->GetInputObject(i);
-      Int_t poiClass = poiCuts->IsSelected(particle,i);
-      if (poiClass<=0) continue;
-      pTrack = poiCuts->FillFlowTrack(fTrackCollection,fNumberOfTracks);
-      if (!pTrack) continue;
-      pTrack->Tag(poiClass); IncrementNumberOfPOIs(poiClass);
-      TrackAdded();
-    }
-  }
+  Fill(rpCuts,poiCuts);
 }
 
 //-------------------------------------------------------------------//
@@ -997,7 +913,7 @@ AliFlowEvent::AliFlowEvent( AliFlowTrackCuts* rpCuts,
 AliFlowEvent::AliFlowEvent( const AliESDEvent* anInput,
                            const AliESDPmdTrack *pmdtracks,
                            const AliCFManager* poiCFManager ):
-  AliFlowEventSimple(20), fApplyRecentering(kFALSE), fCachedRun(-1), fCurrentCentrality(-1)
+  AliFlowEventSimple(20), fApplyRecentering(kFALSE), fCachedRun(-1), fVZEROcentralityBin(-1)
 {
     // constructor
     for(Int_t i(0); i < 9; i++) {
@@ -1140,25 +1056,25 @@ void AliFlowEvent::Get2Qsub(AliFlowVector* Qarray, Int_t n, TList *weightsList,
     Double_t Qycrms(1);        
     
     if( n == 2) {       // second order symmetry
-        Qxamean = fMeanQ[fCurrentCentrality][1][0];
-        Qxarms  = fWidthQ[fCurrentCentrality][1][0];
-        Qyamean = fMeanQ[fCurrentCentrality][1][1];
-        Qyarms  = fWidthQ[fCurrentCentrality][1][1];
-
-        Qxcmean = fMeanQ[fCurrentCentrality][0][0];
-        Qxcrms  = fWidthQ[fCurrentCentrality][0][0];
-        Qycmean = fMeanQ[fCurrentCentrality][0][1];
-        Qycrms  = fWidthQ[fCurrentCentrality][0][1];   
+        Qxamean = fMeanQ[fVZEROcentralityBin][1][0];
+        Qxarms  = fWidthQ[fVZEROcentralityBin][1][0];
+        Qyamean = fMeanQ[fVZEROcentralityBin][1][1];
+        Qyarms  = fWidthQ[fVZEROcentralityBin][1][1];
+
+        Qxcmean = fMeanQ[fVZEROcentralityBin][0][0];
+        Qxcrms  = fWidthQ[fVZEROcentralityBin][0][0];
+        Qycmean = fMeanQ[fVZEROcentralityBin][0][1];
+        Qycrms  = fWidthQ[fVZEROcentralityBin][0][1];  
     } else if (n == 3) {        // third order symmetry
-        Qxamean = fMeanQv3[fCurrentCentrality][1][0];
-        Qxarms  = fWidthQv3[fCurrentCentrality][1][0];
-        Qyamean = fMeanQv3[fCurrentCentrality][1][1];
-        Qyarms  = fWidthQv3[fCurrentCentrality][1][1];
+        Qxamean = fMeanQv3[fVZEROcentralityBin][1][0];
+        Qxarms  = fWidthQv3[fVZEROcentralityBin][1][0];
+        Qyamean = fMeanQv3[fVZEROcentralityBin][1][1];
+        Qyarms  = fWidthQv3[fVZEROcentralityBin][1][1];
   
-        Qxcmean = fMeanQv3[fCurrentCentrality][0][0];
-        Qxcrms  = fWidthQv3[fCurrentCentrality][0][0];
-        Qycmean = fMeanQv3[fCurrentCentrality][0][1];
-        Qycrms  = fWidthQv3[fCurrentCentrality][0][1]; 
+        Qxcmean = fMeanQv3[fVZEROcentralityBin][0][0];
+        Qxcrms  = fWidthQv3[fVZEROcentralityBin][0][0];
+        Qycmean = fMeanQv3[fVZEROcentralityBin][0][1];
+        Qycrms  = fWidthQv3[fVZEROcentralityBin][0][1];        
     }
     // do the correction    
     Double_t QxaCor = (Qxa - Qxamean)/Qxarms;
@@ -1204,15 +1120,15 @@ void AliFlowEvent::SetVZEROCalibrationForTrackCuts(AliFlowTrackCuts* cuts) {
     if(!cuts->GetEvent()) return; // coverity. we need to know the event to get the runnumber and centrlaity
     // get the vzero centrality percentile (cc dependent calibration)
     Float_t v0Centr(cuts->GetEvent()->GetCentrality()->GetCentralityPercentile("V0M"));
-    if(v0Centr < 5) fCurrentCentrality = 0;
-    else if(v0Centr < 10) fCurrentCentrality = 1;
-    else if(v0Centr < 20) fCurrentCentrality = 2;
-    else if(v0Centr < 30) fCurrentCentrality = 3;
-    else if(v0Centr < 40) fCurrentCentrality = 4;
-    else if(v0Centr < 50) fCurrentCentrality = 5;
-    else if(v0Centr < 60) fCurrentCentrality = 6;
-    else if(v0Centr < 70) fCurrentCentrality = 7;
-    else fCurrentCentrality = 8;
+    if(v0Centr < 5) fVZEROcentralityBin = 0;
+    else if(v0Centr < 10) fVZEROcentralityBin = 1;
+    else if(v0Centr < 20) fVZEROcentralityBin = 2;
+    else if(v0Centr < 30) fVZEROcentralityBin = 3;
+    else if(v0Centr < 40) fVZEROcentralityBin = 4;
+    else if(v0Centr < 50) fVZEROcentralityBin = 5;
+    else if(v0Centr < 60) fVZEROcentralityBin = 6;
+    else if(v0Centr < 70) fVZEROcentralityBin = 7;
+    else fVZEROcentralityBin = 8;
 
     // if this event is from the same run as the previous event
     // we can use the cached calibration values, no need to re-open the 
@@ -1414,3 +1330,10 @@ void AliFlowEvent::SetVZEROCalibrationForTrackCuts2011(AliFlowTrackCuts* cuts)
 } 
 //_____________________________________________________________________________
 
+void AliFlowEvent::ClearFast()
+{
+  //clear the event without releasing any memory
+  AliFlowEventSimple::ClearFast();
+  fApplyRecentering=0;
+  fCachedRun=0;
+}
index cbc30dabb1b69ebf89c4ea88862759212569949c..31083425d47c82cee199489e5ddf3a232bf445ed 100644 (file)
@@ -87,13 +87,15 @@ public:
   void SetVZEROCalibrationForTrackCuts(AliFlowTrackCuts* cuts);
   void SetVZEROCalibrationForTrackCuts2011(AliFlowTrackCuts* cuts);
 
+  virtual void ClearFast();
+
 protected:
   AliFlowTrack* ReuseTrack( Int_t i);
 
 private:
   Int_t         fApplyRecentering;      // apply recentering of q-vectors? 2010 is 10h style, 2011 is 11h style
   Int_t         fCachedRun;             //! cached calibration info for vzero
-  Int_t         fCurrentCentrality;     //! centrality bin for the current event 
+  Int_t         fVZEROcentralityBin;     //! centrality bin for the current event 
   Float_t       fMeanQ[9][2][2];        //! recentering
   Float_t       fWidthQ[9][2][2];       //! recentering
   Float_t       fMeanQv3[9][2][2];      //! recentering
index 593c589673466b12e9cd1ca8b14d388b9e681acf..45fd03ea8da2572cd4ce45a90f5fbf30b6d60f55 100644 (file)
@@ -49,6 +49,8 @@
 #include "AliVParticle.h"
 #include "AliVVZERO.h"
 #include "AliMCParticle.h"
+#include "AliESDkink.h"
+#include "AliESDv0.h"
 #include "AliESDtrack.h"
 #include "AliESDMuonTrack.h"   // XZhang 20120604
 #include "AliMultiplicity.h"
 #include "AliESDPmdTrack.h"
 #include "AliESDUtils.h" //TODO
 #include "AliFlowBayesianPID.h"
+#include "AliFlowCandidateTrack.h"
+#include "AliKFParticle.h"
+#include "AliESDVZERO.h"
+#include "AliFlowCommonConstants.h"
 
 ClassImp(AliFlowTrackCuts)
 
@@ -113,9 +119,22 @@ AliFlowTrackCuts::AliFlowTrackCuts():
   fPmdAdc(0.),
   fCutPmdNcell(kFALSE),
   fPmdNcell(0.),  
+  fMinKinkAngle(TMath::DegToRad()*2.),
+  fMinKinkRadius(130.),
+  fMaxKinkRadius(200.),
+  fMinKinkQt(.05),
+  fMaxKinkQt(.5),
+  fMinKinkInvMassKmu(0.),
+  fMaxKinkInvMassKmu(0.6),
+  fForceTPCstandalone(kFALSE),
+  fRequireKinkDaughters(kFALSE),
   fParamType(kGlobal),
   fParamMix(kPure),
+  fKink(NULL),
+  fV0(NULL),
   fTrack(NULL),
+  fTrackMass(0.),
+  fTrackPt(0.),
   fTrackPhi(0.),
   fTrackEta(0.),
   fTrackWeight(1.),
@@ -205,9 +224,22 @@ AliFlowTrackCuts::AliFlowTrackCuts(const char* name):
   fPmdAdc(0.),
   fCutPmdNcell(kFALSE),
   fPmdNcell(0.),  
+  fMinKinkAngle(TMath::DegToRad()*2.),
+  fMinKinkRadius(130.),
+  fMaxKinkRadius(200.),
+  fMinKinkQt(0.05),
+  fMaxKinkQt(0.5),
+  fMinKinkInvMassKmu(0.0),
+  fMaxKinkInvMassKmu(0.6),
+  fForceTPCstandalone(kFALSE),
+  fRequireKinkDaughters(kFALSE),
   fParamType(kGlobal),
   fParamMix(kPure),
+  fKink(NULL),
+  fV0(NULL),
   fTrack(NULL),
+  fTrackMass(0.),
+  fTrackPt(0.),
   fTrackPhi(0.),
   fTrackEta(0.),
   fTrackWeight(1.),
@@ -299,9 +331,22 @@ AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
   fPmdAdc(that.fPmdAdc),
   fCutPmdNcell(that.fCutPmdNcell),
   fPmdNcell(that.fPmdNcell),  
+  fMinKinkAngle(that.fMinKinkAngle),
+  fMinKinkRadius(that.fMinKinkRadius),
+  fMaxKinkRadius(that.fMaxKinkRadius),
+  fMinKinkQt(that.fMinKinkQt),
+  fMaxKinkQt(that.fMaxKinkQt),
+  fMinKinkInvMassKmu(that.fMinKinkInvMassKmu),
+  fMaxKinkInvMassKmu(that.fMaxKinkInvMassKmu),
+  fForceTPCstandalone(that.fForceTPCstandalone),
+  fRequireKinkDaughters(that.fRequireKinkDaughters),
   fParamType(that.fParamType),
   fParamMix(that.fParamMix),
+  fKink(NULL),
+  fV0(NULL),
   fTrack(NULL),
+  fTrackMass(0.),
+  fTrackPt(0.),
   fTrackPhi(0.),
   fTrackEta(0.),
   fTrackWeight(1.),
@@ -412,11 +457,24 @@ AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
   fPmdAdc=that.fPmdAdc;
   fCutPmdNcell=that.fCutPmdNcell;
   fPmdNcell=that.fPmdNcell;
+  fMinKinkAngle=that.fMinKinkAngle;
+  fMinKinkRadius=that.fMinKinkRadius;
+  fMaxKinkRadius=that.fMaxKinkRadius;
+  fMinKinkQt=that.fMinKinkQt;
+  fMaxKinkQt=that.fMaxKinkQt;
+  fMinKinkInvMassKmu=that.fMinKinkInvMassKmu;
+  fMaxKinkInvMassKmu=that.fMaxKinkInvMassKmu;
+  fForceTPCstandalone=that.fForceTPCstandalone;
+  fRequireKinkDaughters=that.fRequireKinkDaughters;
   
   fParamType=that.fParamType;
   fParamMix=that.fParamMix;
 
+  fKink=NULL;
+  fV0=NULL;
   fTrack=NULL;
+  fTrackMass=0.;
+  fTrackPt=0.;
   fTrackEta=0.;
   fTrackPhi=0.;
   fTrackWeight=1.;
@@ -544,6 +602,11 @@ Bool_t AliFlowTrackCuts::IsSelected(TObject* obj, Int_t id)
   if (pmdtrack) return PassesPMDcuts(pmdtrack);
   AliVEvent* vvzero = dynamic_cast<AliVEvent*>(obj); // should be removed; left for protection only
   if (vvzero) return PassesVZEROcuts(id);
+  AliESDkink* kink = dynamic_cast<AliESDkink*>(obj);
+  if (kink) return PassesCuts(kink);
+  //AliESDv0* v0 = dynamic_cast<AliESDv0*>(obj);
+  //if (v0) return PassesCuts(v0);
+  
   return kFALSE;  //default when passed wrong type of object
 }
 
@@ -574,7 +637,7 @@ Bool_t AliFlowTrackCuts::PassesCuts(const AliFlowTrackSimple* track)
   //check cuts on a flowtracksimple
 
   //clean up from last iteration
-  fTrack = NULL;
+  ClearTrack();
   return AliFlowTrackSimpleCuts::PassesCuts(track);
 }
 
@@ -586,9 +649,7 @@ Bool_t AliFlowTrackCuts::PassesCuts(const AliMultiplicity* tracklet, Int_t id)
   if (id<0) return kFALSE;
 
   //clean up from last iteration, and init label
-  fTrack = NULL;
-  fMCparticle=NULL;
-  fTrackLabel=-999;
+  ClearTrack();
 
   fTrackPhi = tracklet->GetPhi(id);
   fTrackEta = tracklet->GetEta(id);
@@ -619,9 +680,7 @@ Bool_t AliFlowTrackCuts::PassesCuts(const AliAODTracklets* tracklet, Int_t id)
   if (id<0) return kFALSE;
 
   //clean up from last iteration, and init label
-  fTrack = NULL;
-  fMCparticle=NULL;
-  fTrackLabel=-999;
+  ClearTrack();
 
   fTrackPhi = tracklet->GetPhi(id);
 //fTrackEta = tracklet->GetEta(id);
@@ -703,6 +762,130 @@ Bool_t AliFlowTrackCuts::PassesMCcuts()
   return PassesMCcuts(fMCevent,fTrackLabel);
 }
 
+//-----------------------------------------------------------------------
+Bool_t AliFlowTrackCuts::PassesCuts(const AliESDv0* v0)
+{
+  //check if the v0 passes cuts
+
+  //clean up from last iteration
+  ClearTrack();
+  
+  fV0 = const_cast<AliESDv0*>(v0);
+
+  Bool_t pass = kTRUE;
+
+  //first, extract/prepare the v0
+  if (!v0->GetOnFlyStatus()) return kFALSE; //skip offline V0 finder
+  const AliExternalTrackParam *negHelix=v0->GetParamN();
+  const AliExternalTrackParam *posHelix=v0->GetParamP();
+  AliVParticle *v0tracks[2];
+  v0tracks[0] = fEvent->GetTrack(v0->GetNindex());
+  v0tracks[1] = fEvent->GetTrack(v0->GetPindex());
+  if( v0tracks[1]->Charge() < 0)
+  {
+    v0tracks[1] = fEvent->GetTrack(v0->GetNindex());
+    v0tracks[0] = fEvent->GetTrack(v0->GetPindex());
+    negHelix=v0->GetParamP();
+    posHelix=v0->GetParamN();
+  }
+
+  int KalmanPidPairs[4][2] =
+  {
+    {-11,11}, // e-,e+ (gamma)
+    {-211,2212}, // pi- p (lambda)
+    {-2212,211}, // anti-p pi+ (anti-lambda)
+    {-211,211} // pi-  pi+ (Kshort)
+    //   {-321,321} // K- K+ (phi)
+  };
+    
+  Int_t id = 3;
+  //refit using a mass hypothesis
+  AliKFParticle v0trackKFneg(*(negHelix),KalmanPidPairs[id][0]);
+  AliKFParticle v0trackKFpos(*(posHelix),KalmanPidPairs[id][1]);
+  AliKFParticle v0particleRefit;
+  v0particleRefit += v0trackKFneg;
+  v0particleRefit += v0trackKFpos;
+  Double_t invMassErr= -999;
+  v0particleRefit.GetMass(fTrackMass,invMassErr);
+  //Double_t openAngle = v0trackKFneg.GetAngle(v0trackKFpos);
+  fTrackEta = v0particleRefit.GetEta();
+  fTrackPt = v0particleRefit.GetPt();
+  fTrackPhi = TMath::Pi()+v0particleRefit.GetPhi();
+  ////find out which mass bin and put the number in fPOItype
+  //Int_t massBins = AliFlowCommonConstants::GetMaster()->GetNbinsMass();
+  //Double_t massMin = AliFlowCommonConstants::GetMaster()->GetMassMin();
+  //Double_t massMax = AliFlowCommonConstants::GetMaster()->GetMassMax();
+  //fPOItype = 1 + int(massBins*(fTrackMass-massMin)/(massMax-massMin));
+  
+  /////////////////////////////////////////////////////////////////////////////
+  //apply cuts
+  if ( v0tracks[0]->Charge() == v0tracks[1]->Charge() ) pass=kFALSE;
+  if ( v0tracks[0]->Pt()<0.15 || v0tracks[1]->Pt()<0.15 ) pass=kFALSE;
+
+  return pass;
+}
+
+//-----------------------------------------------------------------------
+Bool_t AliFlowTrackCuts::PassesCuts(const AliESDkink* kink)
+{
+  //check if the kink passes cuts
+  
+  //clean up from last iteration
+  ClearTrack();
+  fKink=const_cast<AliESDkink*>(kink);
+
+  Bool_t pass = kTRUE;
+
+  Float_t kinkAngle = kink->GetAngle(2);
+  if (kinkAngle<fMinKinkAngle) pass = kFALSE;
+  Double_t kinkRadius = kink->GetR();
+  if (kinkRadius<fMinKinkRadius || kinkRadius>fMaxKinkRadius) pass = kFALSE;
+
+  //Qt
+  const TVector3 motherMfromKink(kink->GetMotherP());
+  const TVector3 daughterMfromKink(kink->GetDaughterP());
+  Float_t qt=kink->GetQt();
+  if ( qt < fMinKinkQt || qt > fMaxKinkQt) pass = kFALSE;
+
+  //invariant mass
+  Float_t energyDaughterMu = TMath::Sqrt( daughterMfromKink.Mag()*daughterMfromKink.Mag()+
+                                          0.105658*0.105658 );
+  Float_t p1XM = motherMfromKink.Px();
+  Float_t p1YM = motherMfromKink.Py();
+  Float_t p1ZM = motherMfromKink.Pz();
+  Float_t p2XM = daughterMfromKink.Px();
+  Float_t p2YM = daughterMfromKink.Py();
+  Float_t p2ZM = daughterMfromKink.Pz();
+  Float_t p3Daughter = TMath::Sqrt( ((p1XM-p2XM)*(p1XM-p2XM))+((p1YM-p2YM)*(p1YM-p2YM))+
+                                    ((p1ZM-p2ZM)*(p1ZM-p2ZM)) );
+  Double_t invariantMassKmu = TMath::Sqrt( (energyDaughterMu+p3Daughter)*(energyDaughterMu+p3Daughter)-
+                                           motherMfromKink.Mag()*motherMfromKink.Mag() );
+  if (invariantMassKmu > fMaxKinkInvMassKmu) pass=kFALSE;
+  if (invariantMassKmu < fMinKinkInvMassKmu) pass=kFALSE;
+  fTrackMass=invariantMassKmu;
+
+  if (fQA)
+  {
+    QAbefore(13)->Fill(qt);
+    if (pass) QAafter(13)->Fill(qt);
+    QAbefore(14)->Fill(invariantMassKmu);
+    if (pass) QAafter(14)->Fill(invariantMassKmu);
+    const Double_t* kinkPosition = kink->GetPosition();
+    QAbefore(15)->Fill(kinkPosition[0],kinkPosition[1]);
+    if (pass) QAafter(15)->Fill(kinkPosition[0],kinkPosition[1]);
+    QAbefore(16)->Fill(motherMfromKink.Mag(),kinkAngle*TMath::RadToDeg());
+    if (pass) QAafter(16)->Fill(motherMfromKink.Mag(),kinkAngle*TMath::RadToDeg());
+  }
+
+  //mother track cuts
+  Int_t indexKinkMother = kink->GetIndex(0);
+  AliESDtrack* motherTrack = dynamic_cast<AliESDtrack*>(fEvent->GetTrack(indexKinkMother));
+  if (!motherTrack) return kFALSE;
+  if (!PassesCuts(motherTrack)) pass = kFALSE;
+  
+  return pass;
+}
+
 //-----------------------------------------------------------------------
 Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
 {
@@ -712,7 +895,8 @@ Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
   //  start by preparing the track parameters to cut on //////////
   ////////////////////////////////////////////////////////////////
   //clean up from last iteration
-  fTrack=NULL; 
+  ClearTrack();
+  Bool_t pass=kTRUE;
 
   //get the label and the mc particle
   fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
@@ -742,7 +926,6 @@ Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
   //because it may be different from global, not needed for aodTrack because we dont do anything funky there
   if (esdTrack) esdTrack = static_cast<AliESDtrack*>(fTrack);
   
-  Bool_t pass=kTRUE;
   //check the common cuts for the current particle fTrack (MC,AOD,ESD)
   Double_t pt = fTrack->Pt();
   Double_t p = fTrack->P();
@@ -1112,6 +1295,8 @@ Bool_t AliFlowTrackCuts::PassesESDcuts(AliESDtrack* track)
     QAbefore(6)->Fill(pt,dcaz);
     if (pass) QAafter(5)->Fill(pt,dcaxy);
     if (pass) QAafter(6)->Fill(pt,dcaz);
+    QAbefore(17)->Fill(Float_t(track->GetKinkIndex(0)));
+    if (pass) QAafter(17)->Fill(Float_t(track->GetKinkIndex(0)));
   }
 
   return pass;
@@ -1153,7 +1338,23 @@ void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
       else fMCparticle=NULL;
       break;
     default:
-      fTrack = track;
+      if (fForceTPCstandalone)
+      {
+        if (!track->FillTPCOnlyTrack(fTPCtrack))
+        {
+          fTrack=NULL;
+          fMCparticle=NULL;
+          fTrackLabel=-998;
+          return;
+        }
+        fTrack = &fTPCtrack;
+        //recalculate the label and mc particle, they may differ as TPClabel != global label
+        fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
+        if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
+        else fMCparticle=NULL;
+      }
+      else 
+        fTrack = track;
       break;
   }
 }
@@ -1321,6 +1522,209 @@ AliFlowTrackCuts* AliFlowTrackCuts::GetStandardMuonTrackCuts(Bool_t isMC, Int_t
   return cuts;
 }
 
+//-----------------------------------------------------------------------
+//AliFlowTrack* AliFlowTrackCuts::FillFlowTrackV0(TObjArray* trackCollection, Int_t trackIndex) const
+//{
+//  //fill flow track from a reconstructed V0 (topological)
+//  AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
+//  if (flowtrack)
+//  {
+//    flowtrack->Clear();
+//  }
+//  else 
+//  {
+//    flowtrack = new AliFlowCandidateTrack();
+//    trackCollection->AddAtAndExpand(flowtrack,trackIndex);
+//  }
+//
+//  TParticle *tmpTParticle=NULL;
+//  AliMCParticle* tmpAliMCParticle=NULL;
+//  AliExternalTrackParam* externalParams=NULL;
+//  AliESDtrack* esdtrack=NULL;
+//  switch(fParamMix)
+//  {
+//    case kPure:
+//      flowtrack->Set(fTrack);
+//      break;
+//    case kTrackWithMCkine:
+//      flowtrack->Set(fMCparticle);
+//      break;
+//    case kTrackWithMCPID:
+//      flowtrack->Set(fTrack);
+//      //flowtrack->setPID(...) from mc, when implemented
+//      break;
+//    case kTrackWithMCpt:
+//      if (!fMCparticle) return NULL;
+//      flowtrack->Set(fTrack);
+//      flowtrack->SetPt(fMCparticle->Pt());
+//      break;
+//    case kTrackWithPtFromFirstMother:
+//      if (!fMCparticle) return NULL;
+//      flowtrack->Set(fTrack);
+//      tmpTParticle = fMCparticle->Particle();
+//      tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
+//      flowtrack->SetPt(tmpAliMCParticle->Pt());
+//      break;
+//    case kTrackWithTPCInnerParams:
+//      esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
+//      if (!esdtrack) return NULL;
+//      externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
+//      if (!externalParams) return NULL;
+//      flowtrack->Set(externalParams);
+//      break;
+//    default:
+//      flowtrack->Set(fTrack);
+//      break;
+//  }
+//  if (fParamType==kMC) 
+//  {
+//    flowtrack->SetSource(AliFlowTrack::kFromMC);
+//    flowtrack->SetID(fTrackLabel);
+//  }
+//  else if (dynamic_cast<AliAODTrack*>(fTrack))
+//  {
+//    if (fParamType==kMUON)                            // XZhang 20120604
+//      flowtrack->SetSource(AliFlowTrack::kFromMUON);  // XZhang 20120604
+//    else                                              // XZhang 20120604
+//      flowtrack->SetSource(AliFlowTrack::kFromAOD);   // XZhang 20120604
+//    flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
+//  }
+//  else if (dynamic_cast<AliMCParticle*>(fTrack)) 
+//  {
+//    flowtrack->SetSource(AliFlowTrack::kFromMC);
+//    flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
+//  }
+//
+//  if (fV0)
+//  {
+//    //add daughter indices
+//  }
+//
+//  return flowtrack;
+//}
+
+//-----------------------------------------------------------------------
+AliFlowTrack* AliFlowTrackCuts::FillFlowTrackKink(TObjArray* trackCollection, Int_t trackIndex) const
+{
+  //fill flow track from AliVParticle (ESD,AOD,MC)
+  AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
+  if (flowtrack)
+  {
+    flowtrack->Clear();
+  }
+  else 
+  {
+    flowtrack = new AliFlowCandidateTrack();
+    trackCollection->AddAtAndExpand(flowtrack,trackIndex);
+  }
+
+  TParticle *tmpTParticle=NULL;
+  AliMCParticle* tmpAliMCParticle=NULL;
+  AliExternalTrackParam* externalParams=NULL;
+  AliESDtrack* esdtrack=NULL;
+  switch(fParamMix)
+  {
+    case kPure:
+      flowtrack->Set(fTrack);
+      break;
+    case kTrackWithMCkine:
+      flowtrack->Set(fMCparticle);
+      break;
+    case kTrackWithMCPID:
+      flowtrack->Set(fTrack);
+      //flowtrack->setPID(...) from mc, when implemented
+      break;
+    case kTrackWithMCpt:
+      if (!fMCparticle) return NULL;
+      flowtrack->Set(fTrack);
+      flowtrack->SetPt(fMCparticle->Pt());
+      break;
+    case kTrackWithPtFromFirstMother:
+      if (!fMCparticle) return NULL;
+      flowtrack->Set(fTrack);
+      tmpTParticle = fMCparticle->Particle();
+      tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
+      flowtrack->SetPt(tmpAliMCParticle->Pt());
+      break;
+    case kTrackWithTPCInnerParams:
+      esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
+      if (!esdtrack) return NULL;
+      externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
+      if (!externalParams) return NULL;
+      flowtrack->Set(externalParams);
+      break;
+    default:
+      flowtrack->Set(fTrack);
+      break;
+  }
+  if (fParamType==kMC) 
+  {
+    flowtrack->SetSource(AliFlowTrack::kFromMC);
+    flowtrack->SetID(fTrackLabel);
+  }
+  else if (dynamic_cast<AliESDtrack*>(fTrack))
+  {
+    flowtrack->SetSource(AliFlowTrack::kFromESD);
+    flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
+  }
+  else if (dynamic_cast<AliESDMuonTrack*>(fTrack))                                  // XZhang 20120604
+  {                                                                                 // XZhang 20120604
+    flowtrack->SetSource(AliFlowTrack::kFromMUON);                                  // XZhang 20120604
+    flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID());  // XZhang 20120604
+  }                                                                                 // XZhang 20120604
+  else if (dynamic_cast<AliAODTrack*>(fTrack))
+  {
+    if (fParamType==kMUON)                            // XZhang 20120604
+      flowtrack->SetSource(AliFlowTrack::kFromMUON);  // XZhang 20120604
+    else                                              // XZhang 20120604
+      flowtrack->SetSource(AliFlowTrack::kFromAOD);   // XZhang 20120604
+    flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
+  }
+  else if (dynamic_cast<AliMCParticle*>(fTrack)) 
+  {
+    flowtrack->SetSource(AliFlowTrack::kFromMC);
+    flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
+  }
+
+  if (fKink)
+  {
+    Int_t indexMother = fKink->GetIndex(0);
+    Int_t indexDaughter = fKink->GetIndex(1);
+    flowtrack->SetID(indexMother);
+    flowtrack->AddDaughter(indexDaughter);
+    flowtrack->SetMass(1.);
+    flowtrack->SetSource(AliFlowTrack::kFromKink);
+  }
+
+  flowtrack->SetMass(fTrackMass);
+
+  return flowtrack;
+}
+
+//-----------------------------------------------------------------------
+AliFlowTrack* AliFlowTrackCuts::FillFlowTrackGeneric(TObjArray* trackCollection, Int_t trackIndex) const
+{
+  //fill a flow track from tracklet,vzero,pmd,...
+  AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
+  if (flowtrack)
+  {
+    flowtrack->Clear();
+  }
+  else 
+  {
+    flowtrack = new AliFlowTrack();
+    trackCollection->AddAtAndExpand(flowtrack,trackIndex);
+  }
+  
+  if (FillFlowTrackGeneric(flowtrack)) return flowtrack;
+  else 
+  {
+    trackCollection->RemoveAt(trackIndex);
+    delete flowtrack;
+    return NULL;
+  }
+}
+
 //-----------------------------------------------------------------------
 Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
 {
@@ -1333,12 +1737,15 @@ Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
       flowtrack->SetPhi(fTrackPhi);
       flowtrack->SetEta(fTrackEta);
       flowtrack->SetWeight(fTrackWeight);
+      flowtrack->SetPt(fTrackPt);
+      flowtrack->SetMass(fTrackMass);
       break;
     case kTrackWithMCkine:
       if (!fMCparticle) return kFALSE;
       flowtrack->SetPhi( fMCparticle->Phi() );
       flowtrack->SetEta( fMCparticle->Eta() );
       flowtrack->SetPt( fMCparticle->Pt() );
+      flowtrack->SetMass(fTrackMass);
       break;
     case kTrackWithMCpt:
       if (!fMCparticle) return kFALSE;
@@ -1346,6 +1753,7 @@ Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
       flowtrack->SetEta(fTrackEta);
       flowtrack->SetWeight(fTrackWeight);
       flowtrack->SetPt(fMCparticle->Pt());
+      flowtrack->SetMass(fTrackMass);
       break;
     case kTrackWithPtFromFirstMother:
       if (!fMCparticle) return kFALSE;
@@ -1355,17 +1763,45 @@ Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
       tmpTParticle = fMCparticle->Particle();
       tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
       flowtrack->SetPt(tmpAliMCParticle->Pt());
+      flowtrack->SetMass(fTrackMass);
       break;
     default:
       flowtrack->SetPhi(fTrackPhi);
       flowtrack->SetEta(fTrackEta);
       flowtrack->SetWeight(fTrackWeight);
+      flowtrack->SetPt(fTrackPt);
+      flowtrack->SetMass(fTrackMass);
       break;
   }
   flowtrack->SetSource(AliFlowTrack::kFromTracklet);
   return kTRUE;
 }
 
+//-----------------------------------------------------------------------
+AliFlowTrack* AliFlowTrackCuts::FillFlowTrackVParticle(TObjArray* trackCollection, Int_t trackIndex) const
+{
+  //fill flow track from AliVParticle (ESD,AOD,MC)
+  
+  AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
+  if (flowtrack)
+  {
+    flowtrack->Clear();
+  }
+  else 
+  {
+    flowtrack = new AliFlowTrack();
+    trackCollection->AddAtAndExpand(flowtrack,trackIndex);
+  }
+
+  if (FillFlowTrackVParticle(flowtrack)) return flowtrack;
+  else
+  {
+    trackCollection->RemoveAt(trackIndex);
+    delete flowtrack;
+    return NULL;
+  }
+}
+
 //-----------------------------------------------------------------------
 Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
 {
@@ -1438,9 +1874,32 @@ Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
     flowtrack->SetSource(AliFlowTrack::kFromMC);
     flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
   }
+  flowtrack->SetMass(fTrackMass);
   return kTRUE;
 }
 
+//-----------------------------------------------------------------------
+AliFlowTrack* AliFlowTrackCuts::FillFlowTrack(TObjArray* trackCollection, Int_t trackIndex) const
+{
+  //fill a flow track constructed from whatever we applied cuts on
+  //return true on success
+  switch (fParamType)
+  {
+    case kSPDtracklet:
+      return FillFlowTrackGeneric(trackCollection, trackIndex);
+    case kPMD:
+      return FillFlowTrackGeneric(trackCollection, trackIndex);
+    case kVZERO:
+      return FillFlowTrackGeneric(trackCollection, trackIndex);
+    case kKink:
+      return FillFlowTrackKink(trackCollection, trackIndex);
+    //case kV0:
+    //  return FillFlowTrackV0(trackCollection, trackIndex);
+    default:
+      return FillFlowTrackVParticle(trackCollection, trackIndex);
+  }
+}
+
 //-----------------------------------------------------------------------
 Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
 {
@@ -1705,7 +2164,7 @@ Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
 //      return MakeFlowTrackVParticle();
 //  }
 //}
-//
+
 //-----------------------------------------------------------------------
 Bool_t AliFlowTrackCuts::IsPhysicalPrimary() const
 {
@@ -1910,6 +2369,21 @@ void AliFlowTrackCuts::DefineHistograms()
   before->Add(new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT",   kNbinsP,binsP,1000,-2e4, 2e4));//12
   after->Add( new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT",   kNbinsP,binsP,1000,-2e4, 2e4));//12
 
+  //kink stuff
+  before->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
+  after->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
+
+  before->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
+  after->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
+
+  before->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
+  after->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
+
+  before->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
+  after->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
+
+  before->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
+  after->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
   TH1::AddDirectory(adddirstatus);
 }
 
@@ -1944,6 +2418,14 @@ Int_t AliFlowTrackCuts::GetNumberOfInputObjects() const
       esd = dynamic_cast<AliESDEvent*>(fEvent);      // XZhang 20120604
       if (esd) return esd->GetNumberOfMuonTracks();  // XZhang 20120604
       return fEvent->GetNumberOfTracks();  // if AOD // XZhang 20120604
+    case kKink:
+      esd = dynamic_cast<AliESDEvent*>(fEvent);
+      if (!esd) return 0;
+      return esd->GetNumberOfKinks();
+    case kV0:
+      esd = dynamic_cast<AliESDEvent*>(fEvent);
+      if (!esd) return 0;
+      return esd->GetNumberOfV0s();
     default:
       if (!fEvent) return 0;
       return fEvent->GetNumberOfTracks();
@@ -1976,20 +2458,27 @@ TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
       if (!esd) return NULL;
       return esd->GetPmdTrack(i);
     case kVZERO:
-      //esd = dynamic_cast<AliESDEvent*>(fEvent);
-      //if (!esd) //contributed by G.Ortona
-      //{
-      //  AliAODEvent* aod = dynamic_cast<AliAODEvent*>(fEvent);
-      //  if(!aod)return NULL;
-      //  return aod->GetVZEROData();
-      //}
-      //return esd->GetVZEROData();
-      return fEvent; // left only for compatibility
+      esd = dynamic_cast<AliESDEvent*>(fEvent);
+      if (!esd) //contributed by G.Ortona
+      {
+        aod = dynamic_cast<AliAODEvent*>(fEvent);
+        if(!aod)return NULL;
+        return aod->GetVZEROData();
+      }
+      return esd->GetVZEROData();
     case kMUON:                                  // XZhang 20120604
       if (!fEvent) return NULL;                  // XZhang 20120604
       esd = dynamic_cast<AliESDEvent*>(fEvent);  // XZhang 20120604
       if (esd) return esd->GetMuonTrack(i);      // XZhang 20120604
       return fEvent->GetTrack(i);  // if AOD     // XZhang 20120604
+    case kKink:
+      esd = dynamic_cast<AliESDEvent*>(fEvent);
+      if (!esd) return NULL;
+      return esd->GetKink(i);
+    case kV0:
+      esd = dynamic_cast<AliESDEvent*>(fEvent);
+      if (!esd) return NULL;
+      return esd->GetV0(i);
     default:
       if (!fEvent) return NULL;
       return fEvent->GetTrack(i);
@@ -2000,13 +2489,26 @@ TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
 void AliFlowTrackCuts::Clear(Option_t*)
 {
   //clean up
-  fTrack=NULL;
   fMCevent=NULL;
+  fEvent=NULL;
+  ClearTrack();
+}
+
+//-----------------------------------------------------------------------
+void AliFlowTrackCuts::ClearTrack(Option_t*)
+{
+  //clean up last track
+  fKink=NULL;
+  fV0=NULL;
+  fTrack=NULL;
   fMCparticle=NULL;
   fTrackLabel=-997;
   fTrackWeight=1.0;
   fTrackEta=0.0;
   fTrackPhi=0.0;
+  fTrackPt=0.0;
+  fPOItype=1;
+  fTrackMass=0.;
 }
 //-----------------------------------------------------------------------
 Bool_t AliFlowTrackCuts::PassesAODpidCut(const AliAODTrack* track )
@@ -4093,6 +4595,10 @@ const char* AliFlowTrackCuts::GetParamTypeName(trackParameterType type)
       return "VZERO";
     case kMUON:       // XZhang 20120604
       return "MUON";  // XZhang 20120604
+    case kKink:
+      return "Kink";
+    case kV0:
+      return "V0";
     default:
       return "unknown";
   }
@@ -4136,9 +4642,7 @@ Bool_t AliFlowTrackCuts::PassesVZEROcuts(Int_t id)
   if (id<0) return kFALSE;
 
   //clean up from last iter
-  fTrack = NULL;
-  fMCparticle=NULL;
-  fTrackLabel=-995;
+  ClearTrack();
 
   fTrackPhi = TMath::PiOver4()*(0.5+id%8);
 
@@ -4198,7 +4702,7 @@ Bool_t AliFlowTrackCuts::PassesVZEROcuts(Int_t id)
 Bool_t AliFlowTrackCuts::PassesMuonCuts(AliVParticle* vparticle)
 {
 // XZhang 20120604
-  fTrack=NULL;
+  ClearTrack();
   fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
   if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
   else fMCparticle=NULL;
index c118a0a2ca9dc2272c0f4f5d59d1107f4e5074b1..bfedc49d4d6ac819ddd7b65395170c734d23c29c 100644 (file)
@@ -63,7 +63,7 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
                             kTPCstandalone, 
                             kSPDtracklet,
                             kPMD,
-                            kV0,    //neutral v0 particle
+                            kV0,    //neutral reconstructed v0 particle
                             kVZERO, //forward VZERO detector
                             kMUON,  // XZhang 20120604
                             kKink
@@ -212,6 +212,7 @@ class AliFlowTrackCuts : public AliFlowTrackSimpleCuts {
   AliMCParticle* GetMCparticle() const {return fMCparticle;}
   //AliFlowTrack* MakeFlowTrack() const;
   Bool_t FillFlowTrack(AliFlowTrack* track) const;
+  //FillFlowTrackV0(TObjArray* trackCollection, Int_t trackIndex) const
   AliFlowTrack* FillFlowTrack(TObjArray* trackCollection, Int_t trackIndex) const;
   Bool_t IsPhysicalPrimary() const; 
   static Bool_t IsPhysicalPrimary(AliMCEvent* p, Int_t label, Bool_t requiretransported=kTRUE);