]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGJE/AliAnalysisTaskFragmentationFunction.cxx
Add more histograms for trigger patch monitoring
[u/mrichter/AliRoot.git] / PWGJE / AliAnalysisTaskFragmentationFunction.cxx
index 220a975640f61ebf30f5b8f80afb6999d605681a..3b75fe8966a823504a5e6e1b56f5e90d2385ee64 100644 (file)
@@ -78,6 +78,7 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction()
    ,fEvtSelectionMask(0)
    ,fEventClass(0)
    ,fMaxVertexZ(10)
+   ,fRejectPileup(kFALSE)
    ,fTrackPtCut(0)
    ,fTrackEtaMin(0)
    ,fTrackEtaMax(0)
@@ -93,6 +94,7 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction()
    ,fJetEtaMax(0)
    ,fJetPhiMin(0)
    ,fJetPhiMax(0)
+   ,fJetMinArea(0)
    ,fFFRadius(0)
    ,fFFMinLTrackPt(-1)
    ,fFFMaxTrackPt(-1)
@@ -127,7 +129,11 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction()
    ,fQAJetHistosGenLeading(0)
    ,fQAJetHistosRecEffLeading(0)
    ,fFFHistosRecCuts(0)
+   ,fFFHistosRecCutsInc(0)
+   ,fFFHistosRecLeadingTrack(0)
    ,fFFHistosGen(0)
+   ,fFFHistosGenInc(0)
+   ,fFFHistosGenLeadingTrack(0)
    ,fQATrackHighPtThreshold(0)
    ,fFFNBinsJetPt(0)    
    ,fFFJetPtMin(0) 
@@ -274,6 +280,7 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const
   ,fEvtSelectionMask(0)
   ,fEventClass(0)
   ,fMaxVertexZ(10)
+  ,fRejectPileup(kFALSE)
   ,fTrackPtCut(0)
   ,fTrackEtaMin(0)
   ,fTrackEtaMax(0)
@@ -289,6 +296,7 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const
   ,fJetEtaMax(0)
   ,fJetPhiMin(0)
   ,fJetPhiMax(0)
+  ,fJetMinArea(0)
   ,fFFRadius(0)
   ,fFFMinLTrackPt(-1)
   ,fFFMaxTrackPt(-1)
@@ -323,7 +331,11 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const
   ,fQAJetHistosGenLeading(0)
   ,fQAJetHistosRecEffLeading(0)
   ,fFFHistosRecCuts(0)
+  ,fFFHistosRecCutsInc(0)
+  ,fFFHistosRecLeadingTrack(0)
   ,fFFHistosGen(0)
+  ,fFFHistosGenInc(0)
+  ,fFFHistosGenLeadingTrack(0)
   ,fQATrackHighPtThreshold(0) 
   ,fFFNBinsJetPt(0)    
   ,fFFJetPtMin(0) 
@@ -471,6 +483,7 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const
   ,fEvtSelectionMask(copy.fEvtSelectionMask)
   ,fEventClass(copy.fEventClass)
   ,fMaxVertexZ(copy.fMaxVertexZ)
+  ,fRejectPileup(copy.fRejectPileup)
   ,fTrackPtCut(copy.fTrackPtCut)
   ,fTrackEtaMin(copy.fTrackEtaMin)
   ,fTrackEtaMax(copy.fTrackEtaMax)
@@ -486,6 +499,7 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const
   ,fJetEtaMax(copy.fJetEtaMax)
   ,fJetPhiMin(copy.fJetPhiMin)
   ,fJetPhiMax(copy.fJetPhiMax)
+  ,fJetMinArea(copy.fJetMinArea)
   ,fFFRadius(copy.fFFRadius)
   ,fFFMinLTrackPt(copy.fFFMinLTrackPt)
   ,fFFMaxTrackPt(copy.fFFMaxTrackPt)
@@ -520,7 +534,11 @@ AliAnalysisTaskFragmentationFunction::AliAnalysisTaskFragmentationFunction(const
   ,fQAJetHistosGenLeading(copy.fQAJetHistosGenLeading)
   ,fQAJetHistosRecEffLeading(copy.fQAJetHistosRecEffLeading)
   ,fFFHistosRecCuts(copy.fFFHistosRecCuts)
+  ,fFFHistosRecCutsInc(copy.fFFHistosRecCutsInc)
+  ,fFFHistosRecLeadingTrack(copy.fFFHistosRecLeadingTrack)
   ,fFFHistosGen(copy.fFFHistosGen)
+  ,fFFHistosGenInc(copy.fFFHistosGenInc)
+  ,fFFHistosGenLeadingTrack(copy.fFFHistosGenLeadingTrack)
   ,fQATrackHighPtThreshold(copy.fQATrackHighPtThreshold) 
   ,fFFNBinsJetPt(copy.fFFNBinsJetPt)    
   ,fFFJetPtMin(copy.fFFJetPtMin) 
@@ -672,6 +690,7 @@ AliAnalysisTaskFragmentationFunction& AliAnalysisTaskFragmentationFunction::oper
     fEvtSelectionMask              = o.fEvtSelectionMask;
     fEventClass                    = o.fEventClass;
     fMaxVertexZ                    = o.fMaxVertexZ;
+    fRejectPileup                  = o.fRejectPileup;
     fTrackPtCut                    = o.fTrackPtCut;
     fTrackEtaMin                   = o.fTrackEtaMin;
     fTrackEtaMax                   = o.fTrackEtaMax;
@@ -687,6 +706,7 @@ AliAnalysisTaskFragmentationFunction& AliAnalysisTaskFragmentationFunction::oper
     fJetEtaMax                     = o.fJetEtaMax;
     fJetPhiMin                     = o.fJetPhiMin;
     fJetPhiMax                     = o.fJetPhiMin;
+    fJetMinArea                    = o.fJetMinArea;
     fFFRadius                      = o.fFFRadius;
     fFFMinLTrackPt                 = o.fFFMinLTrackPt;
     fFFMaxTrackPt                  = o.fFFMaxTrackPt;
@@ -726,7 +746,11 @@ AliAnalysisTaskFragmentationFunction& AliAnalysisTaskFragmentationFunction::oper
     fQAJetHistosGenLeading         = o.fQAJetHistosGenLeading;
     fQAJetHistosRecEffLeading      = o.fQAJetHistosRecEffLeading;
     fFFHistosRecCuts               = o.fFFHistosRecCuts;
+    fFFHistosRecCutsInc            = o.fFFHistosRecCutsInc;
+    fFFHistosRecLeadingTrack       = o.fFFHistosRecLeadingTrack;
     fFFHistosGen                   = o.fFFHistosGen;
+    fFFHistosGenInc                = o.fFFHistosGenInc;
+    fFFHistosGenLeadingTrack       = o.fFFHistosGenLeadingTrack;
     fQATrackHighPtThreshold        = o.fQATrackHighPtThreshold; 
     fFFNBinsJetPt                  = o.fFFNBinsJetPt;    
     fFFJetPtMin                    = o.fFFJetPtMin; 
@@ -1380,14 +1404,15 @@ void AliAnalysisTaskFragmentationFunction::UserCreateOutputObjects()
   
   
   // Histograms        
-  fh1EvtSelection            = new TH1F("fh1EvtSelection", "Event Selection", 6, -0.5, 5.5);
+  fh1EvtSelection            = new TH1F("fh1EvtSelection", "Event Selection", 7, -0.5, 6.5);
   fh1EvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
   fh1EvtSelection->GetXaxis()->SetBinLabel(2,"event selection: rejected");
   fh1EvtSelection->GetXaxis()->SetBinLabel(3,"event class: rejected");
   fh1EvtSelection->GetXaxis()->SetBinLabel(4,"vertex Ncontr: rejected");
   fh1EvtSelection->GetXaxis()->SetBinLabel(5,"vertex z: rejected");
   fh1EvtSelection->GetXaxis()->SetBinLabel(6,"vertex type: rejected");
-  
+  fh1EvtSelection->GetXaxis()->SetBinLabel(7,"pileup: rejected");
   fh1VertexNContributors     = new TH1F("fh1VertexNContributors", "Vertex N contributors", 2500,-.5, 2499.5);
   fh1VertexZ                 = new TH1F("fh1VertexZ", "Vertex z distribution", 30, -15., 15.);
   fh1EvtMult                = new TH1F("fh1EvtMult","Event multiplicity, track pT cut > 150 MeV/c, |#eta| < 0.9",120,0.,12000.);
@@ -1459,10 +1484,33 @@ void AliAnalysisTaskFragmentationFunction::UserCreateOutputObjects()
                                                     fFFNBinsXi, fFFXiMin, fFFXiMax,  
                                                     fFFNBinsZ , fFFZMin , fFFZMax );
 
-    fFFHistosGen            = new AliFragFuncHistos("Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
+
+    fFFHistosRecCutsInc      = new AliFragFuncHistos("RecCutsInc", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
                                                     fFFNBinsPt, fFFPtMin, fFFPtMax, 
                                                     fFFNBinsXi, fFFXiMin, fFFXiMax,  
-                                                    fFFNBinsZ , fFFZMin , fFFZMax);
+                                                    fFFNBinsZ , fFFZMin , fFFZMax );
+
+
+    fFFHistosRecLeadingTrack  = new AliFragFuncHistos("RecLeadingTrack", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
+                                                     fFFNBinsPt, fFFPtMin, fFFPtMax, 
+                                                     fFFNBinsXi, fFFXiMin, fFFXiMax,  
+                                                     fFFNBinsZ , fFFZMin , fFFZMax );
+    
+    fFFHistosGen             = new AliFragFuncHistos("Gen", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
+                                                     fFFNBinsPt, fFFPtMin, fFFPtMax, 
+                                                     fFFNBinsXi, fFFXiMin, fFFXiMax,  
+                                                     fFFNBinsZ , fFFZMin , fFFZMax);
+    
+    fFFHistosGenInc           = new AliFragFuncHistos("GenInc", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
+                                                     fFFNBinsPt, fFFPtMin, fFFPtMax, 
+                                                     fFFNBinsXi, fFFXiMin, fFFXiMax,  
+                                                     fFFNBinsZ , fFFZMin , fFFZMax);
+    
+    fFFHistosGenLeadingTrack  = new AliFragFuncHistos("GenLeadingTrack", fFFNBinsJetPt, fFFJetPtMin, fFFJetPtMax, 
+                                                     fFFNBinsPt, fFFPtMin, fFFPtMax, 
+                                                     fFFNBinsXi, fFFXiMin, fFFXiMax,  
+                                                     fFFNBinsZ , fFFZMin , fFFZMax);
+
   } // end: FF
   
   // efficiency
@@ -1718,7 +1766,11 @@ void AliAnalysisTaskFragmentationFunction::UserCreateOutputObjects()
   
   if(fFFMode){
     fFFHistosRecCuts->DefineHistos();
+    fFFHistosRecCutsInc->DefineHistos();
+    fFFHistosRecLeadingTrack->DefineHistos();
     fFFHistosGen->DefineHistos();
+    fFFHistosGenInc->DefineHistos();
+    fFFHistosGenLeadingTrack->DefineHistos();
   }
   
   if(fEffMode){
@@ -1794,8 +1846,13 @@ void AliAnalysisTaskFragmentationFunction::UserCreateOutputObjects()
   // FF histograms
   if(fFFMode){
     fFFHistosRecCuts->AddToOutput(fCommonHistList);
+    fFFHistosRecCutsInc->AddToOutput(fCommonHistList);
+    fFFHistosRecLeadingTrack->AddToOutput(fCommonHistList);
+
     if(genJets && genTracks){
       fFFHistosGen->AddToOutput(fCommonHistList);
+      fFFHistosGenInc->AddToOutput(fCommonHistList);
+      fFFHistosGenLeadingTrack->AddToOutput(fCommonHistList);
     }
   }
 
@@ -2135,6 +2192,13 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
     return;
   }
 
+  if(fRejectPileup && AliAnalysisHelperJetTasks::IsPileUp()){
+    if (fDebug > 1) Printf("%s:%d SPD pileup: event REJECTED...",(char*)__FILE__,__LINE__);
+    fh1EvtSelection->Fill(6.);
+    PostData(1, fCommonHistList);
+    return;
+  }
+
   if (fDebug > 1) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__); 
   fh1EvtSelection->Fill(0.);
   fh1EvtCent->Fill(centPercent);
@@ -2322,181 +2386,193 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
       
       AliAODJet* jet = (AliAODJet*)(fJetsRecCuts->At(ij));
       if(fQAMode&2) fQAJetHistosRecCuts->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
-      
-      if(ij==0){ // leading jet
-       
-       if(fQAMode&2) fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
+       
+      if(fQAMode&2 && ij==0) fQAJetHistosRecCutsLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt() );
 
-       Double_t ptFractionEmbedded = 0; 
-       AliAODJet* embeddedJet = 0; 
-
-       if(fBranchEmbeddedJets.Length()){ // find embedded jet
-
-         Int_t indexEmbedded = -1;
-         for(Int_t i=0; i<nEmbeddedJets; i++){
-           if(iEmbeddedMatchIndex[i] == ij){
-             indexEmbedded      = i;
-             ptFractionEmbedded = fEmbeddedPtFraction[i];
-           }
-         }
+      Double_t ptFractionEmbedded = 0; 
+      AliAODJet* embeddedJet = 0; 
 
-         fh1IndexEmbedded->Fill(indexEmbedded);
-         fh1FractionPtEmbedded->Fill(ptFractionEmbedded);
-         
-         if(indexEmbedded>-1){ 
-           
-           embeddedJet = dynamic_cast<AliAODJet*>(fJetsEmbedded->At(indexEmbedded));
-           if(!embeddedJet) continue;
+      if(fBranchEmbeddedJets.Length()){ // find embedded jet
 
-           Double_t deltaPt = jet->Pt() - embeddedJet->Pt();
-           Double_t deltaR  = jet->DeltaR((AliVParticle*) (embeddedJet)); 
-           
-           fh2DeltaPtVsJetPtEmbedded->Fill(embeddedJet->Pt(),deltaPt);
-           fh2DeltaPtVsRecJetPtEmbedded->Fill(jet->Pt(),deltaPt);
-           fh1DeltaREmbedded->Fill(deltaR);
+       Int_t indexEmbedded = -1;
+       for(Int_t i=0; i<nEmbeddedJets; i++){
+         if(iEmbeddedMatchIndex[i] == ij){
+           indexEmbedded      = i;
+           ptFractionEmbedded = fEmbeddedPtFraction[i];
          }
        }
 
-       // get tracks in jet
-       TList* jettracklist = new TList();
-       Double_t sumPt      = 0.;
-       Bool_t isBadJet     = kFALSE;
-
-       if(GetFFRadius()<=0){
-         GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
-       } else {
-         if(fUseEmbeddedJetAxis){
-           if(embeddedJet) GetJetTracksPointing(fTracksRecCuts, jettracklist, embeddedJet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
-         }
-         else              GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
-       }
+       fh1IndexEmbedded->Fill(indexEmbedded);
+       fh1FractionPtEmbedded->Fill(ptFractionEmbedded);
        
-       if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
-       
-       if(isBadJet) continue; 
-
-       if(ptFractionEmbedded>=fCutFractionPtEmbedded){ // if no embedding: ptFraction = cutFraction = 0
-         
-         for(Int_t it=0; it<jettracklist->GetSize(); ++it){
-
-           AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
-           if(!trackVP)continue;
-
-            AliAODTrack * aodtrack  = dynamic_cast<AliAODTrack*>(jettracklist->At(it));
-            if(!aodtrack) continue;
-
-           TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
-           
-           Float_t jetPt   = jet->Pt();
-           if(fUseEmbeddedJetPt){
-             if(embeddedJet) jetPt = embeddedJet->Pt();
-             else jetPt = 0;
-           }
-           Float_t trackPt = trackV->Pt();
-
-
-           Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
+       if(indexEmbedded>-1){ 
            
-           if(fFFMode) fFFHistosRecCuts->FillFF(trackPt, jetPt, incrementJetPt);
+         embeddedJet = dynamic_cast<AliAODJet*>(fJetsEmbedded->At(indexEmbedded));
+         if(!embeddedJet) continue;
 
-           delete trackV;
-         }
+         Double_t deltaPt = jet->Pt() - embeddedJet->Pt();
+         Double_t deltaR  = jet->DeltaR((AliVParticle*) (embeddedJet)); 
          
-         // background ff
-         if(fBckgMode){
-           if(fBckgType[0]!=kBckgNone)
-             FillBckgHistos(fBckgType[0], fTracksRecCuts, fJetsRecCuts, jet,  
-                            fFFBckgHisto0RecCuts,fQABckgHisto0RecCuts, fh1BckgMult0);
-           if(fBckgType[1]!=kBckgNone)
-             FillBckgHistos(fBckgType[1], fTracksRecCuts, fJetsRecCuts, jet,
-                            fFFBckgHisto1RecCuts,fQABckgHisto1RecCuts, fh1BckgMult1);
-           if(fBckgType[2]!=kBckgNone)
-             FillBckgHistos(fBckgType[2], fTracksRecCuts, fJetsRecCuts, jet, 
-                            fFFBckgHisto2RecCuts,fQABckgHisto2RecCuts, fh1BckgMult2);
-           if(fBckgType[3]!=kBckgNone)
-             FillBckgHistos(fBckgType[3], fTracksRecCuts, fJetsRecCuts, jet, 
-                            fFFBckgHisto3RecCuts,fQABckgHisto3RecCuts, fh1BckgMult3);
-           if(fBckgType[4]!=kBckgNone)
-             FillBckgHistos(fBckgType[4], fTracksRecCuts, fJetsRecCuts, jet, 
-                            fFFBckgHisto4RecCuts,fQABckgHisto4RecCuts, fh1BckgMult4);
-         } // end if(fBckgMode)
-        
-
-         if(fJSMode) FillJetShape(jet, jettracklist, fProNtracksLeadingJet, fProDelRPtSum, fProDelR80pcPt);
-          
-         delete jettracklist;  
-
-       } // end: cut embedded ratio
-      } // end: leading jet
-    } // end: rec. jets after cuts
-    
-    // generated jets
-    for(Int_t ij=0; ij<nGenJets; ++ij){
-      
-      AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
-      if(!jet)continue;
-      if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
-      
-      if(ij==0){ // leading jet
-       
-       if(fQAMode&2) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
-
-       TList* jettracklist = new TList();
-       Double_t sumPt      = 0.;
-       Bool_t isBadJet     = kFALSE;
-       
-       if(GetFFRadius()<=0){
-         GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
-       } else {
-         GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
+         fh2DeltaPtVsJetPtEmbedded->Fill(embeddedJet->Pt(),deltaPt);
+         fh2DeltaPtVsRecJetPtEmbedded->Fill(jet->Pt(),deltaPt);
+         fh1DeltaREmbedded->Fill(deltaR);
        }
+      }
+
+      // get tracks in jet
+      TList* jettracklist = new TList();
+      Double_t sumPt      = 0.;
+      Bool_t isBadJet     = kFALSE;
+
+      if(GetFFRadius()<=0){
+       GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
+      } else {
+       if(fUseEmbeddedJetAxis){
+         if(embeddedJet) GetJetTracksPointing(fTracksRecCuts, jettracklist, embeddedJet, 
+                                              GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
+         }
+       else              GetJetTracksPointing(fTracksRecCuts, jettracklist, jet, 
+                                              GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
+      }
        
-       if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
-       if(isBadJet) continue; 
+      if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;
+      
+      if(isBadJet){
+       delete jettracklist;
+       continue; 
+      }
 
+      if(ptFractionEmbedded>=fCutFractionPtEmbedded){ // if no embedding: ptFraction = cutFraction = 0
+         
        for(Int_t it=0; it<jettracklist->GetSize(); ++it){
          
          AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
          if(!trackVP)continue;
+
+         AliAODTrack * aodtrack  = dynamic_cast<AliAODTrack*>(jettracklist->At(it));
+         if(!aodtrack) continue;
+         
          TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
          
          Float_t jetPt   = jet->Pt();
+         if(fUseEmbeddedJetPt){
+           if(embeddedJet) jetPt = embeddedJet->Pt();
+           else jetPt = 0;
+         }
          Float_t trackPt = trackV->Pt();
-         
+
          Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
+           
+         if(fFFMode && (ij==0)) fFFHistosRecCuts->FillFF(trackPt, jetPt, incrementJetPt);
+         if(fFFMode)            fFFHistosRecCutsInc->FillFF(trackPt, jetPt, incrementJetPt);
          
-         if(fFFMode) fFFHistosGen->FillFF( trackPt, jetPt, incrementJetPt );
+         if(it==0){ // leading track 
+           if(fFFMode) fFFHistosRecLeadingTrack->FillFF( trackPt, jetPt, kTRUE);
+         }
          
          delete trackV;
        }
-
-       if(fBckgMode){
+         
+       // background ff
+       if(fBckgMode && (ij==0)){
          if(fBckgType[0]!=kBckgNone)
-           FillBckgHistos(fBckgType[0], fTracksGen, fJetsGen, jet,
-                          fFFBckgHisto0Gen, fQABckgHisto0Gen);
+           FillBckgHistos(fBckgType[0], fTracksRecCuts, fJetsRecCuts, jet,  
+                          fFFBckgHisto0RecCuts,fQABckgHisto0RecCuts, fh1BckgMult0);
          if(fBckgType[1]!=kBckgNone)
-           FillBckgHistos(fBckgType[1], fTracksGen, fJetsGen, jet,
-                          fFFBckgHisto1Gen, fQABckgHisto1Gen);
+           FillBckgHistos(fBckgType[1], fTracksRecCuts, fJetsRecCuts, jet,
+                          fFFBckgHisto1RecCuts,fQABckgHisto1RecCuts, fh1BckgMult1);
          if(fBckgType[2]!=kBckgNone)
-           FillBckgHistos(fBckgType[2], fTracksGen, fJetsGen, jet,
-                          fFFBckgHisto2Gen, fQABckgHisto2Gen);
+           FillBckgHistos(fBckgType[2], fTracksRecCuts, fJetsRecCuts, jet, 
+                          fFFBckgHisto2RecCuts,fQABckgHisto2RecCuts, fh1BckgMult2);
          if(fBckgType[3]!=kBckgNone)
-           FillBckgHistos(fBckgType[3], fTracksGen, fJetsGen, jet,
-                          fFFBckgHisto3Gen, fQABckgHisto3Gen);
+           FillBckgHistos(fBckgType[3], fTracksRecCuts, fJetsRecCuts, jet, 
+                          fFFBckgHisto3RecCuts,fQABckgHisto3RecCuts, fh1BckgMult3);
          if(fBckgType[4]!=kBckgNone)
-           FillBckgHistos(fBckgType[4], fTracksGen, fJetsGen, jet,
-                          fFFBckgHisto4Gen, fQABckgHisto4Gen);
+           FillBckgHistos(fBckgType[4], fTracksRecCuts, fJetsRecCuts, jet, 
+                          fFFBckgHisto4RecCuts,fQABckgHisto4RecCuts, fh1BckgMult4);
        } // end if(fBckgMode)
        
 
-       if(fJSMode) FillJetShape(jet, jettracklist, fProNtracksLeadingJetGen, fProDelRPtSumGen, fProDelR80pcPtGen);
+       if(fJSMode && (ij==0)) FillJetShape(jet, jettracklist, fProNtracksLeadingJet, fProDelRPtSum, fProDelR80pcPt);
+          
+       delete jettracklist;    
+       
+      } // end: cut embedded ratio
+    } // end: rec. jets after cuts
+    
+    // generated jets
+    for(Int_t ij=0; ij<nGenJets; ++ij){
+      
+      AliAODJet* jet = dynamic_cast<AliAODJet*>(fJetsGen->At(ij));
+      if(!jet)continue;
+
+      if(fQAMode&2) fQAJetHistosGen->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
+
+      if(fQAMode&2 && (ij==0)) fQAJetHistosGenLeading->FillJetQA( jet->Eta(), TVector2::Phi_0_2pi(jet->Phi()), jet->Pt());
 
+      TList* jettracklist = new TList();
+      Double_t sumPt      = 0.;
+      Bool_t isBadJet     = kFALSE;
+       
+      if(GetFFRadius()<=0){
+       GetJetTracksTrackrefs(jettracklist, jet, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
+      } else {
+       GetJetTracksPointing(fTracksGen, jettracklist, jet, GetFFRadius(), sumPt, GetFFMinLTrackPt(), GetFFMaxTrackPt(), isBadJet);
+      }
+      
+      if(GetFFMinNTracks()>0 && jettracklist->GetSize()<=GetFFMinNTracks()) isBadJet = kTRUE;;
+      
+      if(isBadJet){
        delete jettracklist;
+       continue; 
+      }
+
+      for(Int_t it=0; it<jettracklist->GetSize(); ++it){
+       
+       AliVParticle*   trackVP = dynamic_cast<AliVParticle*>(jettracklist->At(it));
+       if(!trackVP)continue;
+       TLorentzVector* trackV  = new TLorentzVector(trackVP->Px(),trackVP->Py(),trackVP->Pz(),trackVP->P());
+       
+       Float_t jetPt   = jet->Pt();
+       Float_t trackPt = trackV->Pt();
+       
+       Bool_t incrementJetPt = (it==0) ? kTRUE : kFALSE;
+       
+       if(fFFMode && (ij==0)) fFFHistosGen->FillFF( trackPt, jetPt, incrementJetPt );
+       if(fFFMode)            fFFHistosGenInc->FillFF( trackPt, jetPt, incrementJetPt );
+       
+       if(it==0){ // leading track
+         if(fFFMode) fFFHistosGenLeadingTrack->FillFF( trackPt, jetPt, kTRUE );          
+       }
+       
+       delete trackV;
       }
-    }
-  } // end: QA, FF and intra-jet
 
+      if(fBckgMode && (ij==0)){
+       if(fBckgType[0]!=kBckgNone)
+         FillBckgHistos(fBckgType[0], fTracksGen, fJetsGen, jet,
+                        fFFBckgHisto0Gen, fQABckgHisto0Gen);
+       if(fBckgType[1]!=kBckgNone)
+         FillBckgHistos(fBckgType[1], fTracksGen, fJetsGen, jet,
+                        fFFBckgHisto1Gen, fQABckgHisto1Gen);
+       if(fBckgType[2]!=kBckgNone)
+         FillBckgHistos(fBckgType[2], fTracksGen, fJetsGen, jet,
+                        fFFBckgHisto2Gen, fQABckgHisto2Gen);
+       if(fBckgType[3]!=kBckgNone)
+         FillBckgHistos(fBckgType[3], fTracksGen, fJetsGen, jet,
+                        fFFBckgHisto3Gen, fQABckgHisto3Gen);
+       if(fBckgType[4]!=kBckgNone)
+         FillBckgHistos(fBckgType[4], fTracksGen, fJetsGen, jet,
+                        fFFBckgHisto4Gen, fQABckgHisto4Gen);
+      } // end if(fBckgMode)
       
+      if(fJSMode && (ij==0)) FillJetShape(jet, jettracklist, fProNtracksLeadingJetGen, fProDelRPtSumGen, fProDelR80pcPtGen);
+      
+      delete jettracklist;
+    }
+  } // end: QA, FF and intra-jet
+  
+  
   // ____ efficiency _______________________________
 
   if(fEffMode && (fJetTypeRecEff != kJetsUndef)){
@@ -2596,7 +2672,14 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
        if(GetFFMinNTracks()>0 && jettracklistGenSecNS->GetSize()<=GetFFMinNTracks())  isBadJetGenSec  = kTRUE;
        if(GetFFMinNTracks()>0 && jettracklistRec->GetSize()<=GetFFMinNTracks())       isBadJetRec     = kTRUE;
 
-       if(isBadJetRec) continue;
+       if(isBadJetRec){
+         delete jettracklistGenPrim;
+         delete jettracklistGenSecNS;
+         delete jettracklistGenSecS;
+         delete jettracklistRec;
+
+         continue;
+       }
 
        if(fQAMode&2) fQAJetHistosRecEffLeading->FillJetQA( jetEta, jetPhi, sumPtGenLeadingJetRecEff ); 
        
@@ -2637,7 +2720,7 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
                                                    jettracklistRec,kTRUE,fJSMode,fProNtracksLeadingJetRecSecSsc,fProDelRPtSumRecSecSsc);
         }
        
-       delete jettracklistGenPrim;
+       delete jettracklistGenPrim;
        delete jettracklistGenSecNS;
        delete jettracklistGenSecS;
        delete jettracklistRec;
@@ -2649,7 +2732,7 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
          TList* perpjettracklistGen1 = new TList();
          TList* perpjettracklistGen2 = new TList();
 
-         Double_t sumPtGenPerp  = 0.;
+         //Double_t sumPtGenPerp  = 0.;
          Double_t sumPtGenPerp1 = 0.;
          Double_t sumPtGenPerp2 = 0.;
          GetTracksTiltedwrpJetAxis(TMath::Pi()/2.,fTracksAODMCCharged, perpjettracklistGen1, jet, TMath::Abs(GetFFRadius()) , sumPtGenPerp1); 
@@ -2657,13 +2740,13 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
 
          perpjettracklistGen->AddAll(perpjettracklistGen1);
          perpjettracklistGen->AddAll(perpjettracklistGen2);
-         sumPtGenPerp = 0.5*(sumPtGenPerp1+sumPtGenPerp2);
+         //sumPtGenPerp = 0.5*(sumPtGenPerp1+sumPtGenPerp2);
 
          TList* perpjettracklistGenSecNS  = new TList();
          TList* perpjettracklistGenSecNS1 = new TList();
          TList* perpjettracklistGenSecNS2 = new TList();
 
-          Double_t sumPtGenPerpNS;
+          //Double_t sumPtGenPerpNS;
           Double_t sumPtGenPerpNS1;
           Double_t sumPtGenPerpNS2;
           GetTracksTiltedwrpJetAxis(TMath::Pi()/2.,fTracksAODMCChargedSecNS, perpjettracklistGenSecNS1, jet, TMath::Abs(GetFFRadius()) , sumPtGenPerpNS1); 
@@ -2671,14 +2754,14 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
 
          perpjettracklistGenSecNS->AddAll(perpjettracklistGenSecNS1);
          perpjettracklistGenSecNS->AddAll(perpjettracklistGenSecNS2);
-         sumPtGenPerpNS = 0.5*(sumPtGenPerpNS1+sumPtGenPerpNS2);
+         //sumPtGenPerpNS = 0.5*(sumPtGenPerpNS1+sumPtGenPerpNS2);
 
 
          TList* perpjettracklistGenSecS  = new TList();
          TList* perpjettracklistGenSecS1 = new TList();
          TList* perpjettracklistGenSecS2 = new TList();
 
-          Double_t sumPtGenPerpS;
+          //Double_t sumPtGenPerpS;
           Double_t sumPtGenPerpS1;
           Double_t sumPtGenPerpS2;
           GetTracksTiltedwrpJetAxis(TMath::Pi()/2.,fTracksAODMCChargedSecS, perpjettracklistGenSecS1, jet, TMath::Abs(GetFFRadius()) , sumPtGenPerpS1); 
@@ -2686,7 +2769,7 @@ void AliAnalysisTaskFragmentationFunction::UserExec(Option_t *)
 
          perpjettracklistGenSecS->AddAll(perpjettracklistGenSecS1);
          perpjettracklistGenSecS->AddAll(perpjettracklistGenSecS2);
-         sumPtGenPerpS = 0.5*(sumPtGenPerpS1+sumPtGenPerpS2);
+         //sumPtGenPerpS = 0.5*(sumPtGenPerpS1+sumPtGenPerpS2);
 
 
           if(perpjettracklistGen->GetSize() != perpjettracklistGen1->GetSize() + perpjettracklistGen2->GetSize()){
@@ -2883,23 +2966,28 @@ Int_t AliAnalysisTaskFragmentationFunction::GetListOfTracks(TList *list, Int_t t
        if(type==kTrackAODMCChargedSecNS || type==kTrackAODMCChargedSecS){
          Bool_t isFromStrange = kFALSE;
          Int_t iMother = part->GetMother();
-         if(iMother >= 0){
-           AliAODMCParticle *partM = dynamic_cast<AliAODMCParticle*>(tca->At(iMother));
-           if(!partM) continue;
 
-           Int_t codeM =  TMath::Abs(partM->GetPdgCode());
-           Int_t mfl = Int_t (codeM/ TMath::Power(10, Int_t(TMath::Log10(codeM))));
-           if  (mfl == 3 && codeM != 3) isFromStrange = kTRUE;
+          if(iMother < 0) continue; // throw out PYTHIA stack partons + incoming protons
+
+         AliAODMCParticle *partM = dynamic_cast<AliAODMCParticle*>(tca->At(iMother));
+         if(!partM) continue;
+
+         Int_t codeM =  TMath::Abs(partM->GetPdgCode());
+         Int_t mfl = Int_t (codeM/ TMath::Power(10, Int_t(TMath::Log10(codeM))));
+         if  (mfl == 3 && codeM != 3) isFromStrange = kTRUE;
            
-           // if(mfl ==3){
-           //   cout<<" mfl "<<mfl<<" codeM "<<partM->GetPdgCode()<<" code this track "<<part->GetPdgCode()<<endl; 
-           //   cout<<" index this track "<<it<<" index daughter 0 "<<partM->GetDaughter(0)<<" 1 "<<partM->GetDaughter(1)<<endl; 
-           // }
+          if(codeM == 130) isFromStrange = kTRUE; // K0 long
+          if(part->IsSecondaryFromMaterial()) isFromStrange = kFALSE; // strange resonances from hadronic showers ? 
 
-           if(type==kTrackAODMCChargedSecNS && isFromStrange) continue;
-           if(type==kTrackAODMCChargedSecS  && !isFromStrange) continue;
-         }
+         // if(mfl ==3){
+         //   cout<<" mfl "<<mfl<<" codeM "<<partM->GetPdgCode()<<" code this track "<<part->GetPdgCode()<<endl; 
+         //   cout<<" index this track "<<it<<" index daughter 0 "<<partM->GetDaughter(0)<<" 1 "<<partM->GetDaughter(1)<<endl; 
+         // }
+
+         if(type==kTrackAODMCChargedSecNS && isFromStrange) continue;
+         if(type==kTrackAODMCChargedSecS  && !isFromStrange) continue;
        }
+       
 
        if(type==kTrackAODMCChargedAcceptance && 
           (     part->Eta() > fTrackEtaMax
@@ -2956,6 +3044,7 @@ Int_t AliAnalysisTaskFragmentationFunction::GetListOfJets(TList *list, Int_t typ
       if(!tmp) continue;
 
       if( tmp->Pt() < fJetPtCut ) continue;
+      if( tmp->EffectiveAreaCharged() < fJetMinArea ) continue;
       if( type == kJetsRecAcceptance &&
          (    tmp->Eta() < fJetEtaMin
            || tmp->Eta() > fJetEtaMax
@@ -3062,6 +3151,7 @@ Int_t AliAnalysisTaskFragmentationFunction::GetListOfJets(TList *list, Int_t typ
       if(!tmp) continue;
          
       if( tmp->Pt() < fJetPtCut ) continue;
+      if( tmp->EffectiveAreaCharged() < fJetMinArea ) continue;
       if( type == kJetsGenAcceptance &&
          (    tmp->Eta() < fJetEtaMin
            || tmp->Eta() > fJetEtaMax
@@ -3102,6 +3192,7 @@ Int_t AliAnalysisTaskFragmentationFunction::GetListOfJets(TList *list, Int_t typ
       if(!tmp) continue;
 
       if( tmp->Pt() < fJetPtCut ) continue;
+      if( tmp->EffectiveAreaCharged() < fJetMinArea ) continue;
       if(    tmp->Eta() < fJetEtaMin
          || tmp->Eta() > fJetEtaMax
          || tmp->Phi() < fJetPhiMin
@@ -3179,7 +3270,7 @@ Int_t AliAnalysisTaskFragmentationFunction::GetListOfBckgJets(TList *list, Int_t
 } 
 
 // _________________________________________________________________________________________________________
-void AliAnalysisTaskFragmentationFunction::SetProperties(THnSparse* h,const Int_t dim, const char** labels)
+void AliAnalysisTaskFragmentationFunction::SetProperties(THnSparse* h, Int_t dim, const char** labels)
 {
   // Set properties of THnSparse 
 
@@ -3215,7 +3306,7 @@ void AliAnalysisTaskFragmentationFunction::SetProperties(TH1* h,const char* x, c
 
 // ________________________________________________________________________________________________________________________________________________________
 void AliAnalysisTaskFragmentationFunction::GetJetTracksPointing(TList* inputlist, TList* outputlist, const AliAODJet* jet, 
-                                                                  const Double_t radius, Double_t& sumPt, const Double_t minPtL, const Double_t maxPt, Bool_t& isBadPt)
+                                                                  Double_t radius, Double_t& sumPt, Double_t minPtL, Double_t maxPt, Bool_t& isBadPt)
 {
   // fill list of tracks in cone around jet axis  
 
@@ -3256,7 +3347,7 @@ void AliAnalysisTaskFragmentationFunction::GetJetTracksPointing(TList* inputlist
 }
 
 // _________________________________________________________________________________________________________________________________________________________________
-void AliAnalysisTaskFragmentationFunction::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, const Double_t minPtL, const Double_t maxPt, Bool_t& isBadPt)
+void AliAnalysisTaskFragmentationFunction::GetJetTracksTrackrefs(TList* list, const AliAODJet* jet, Double_t minPtL, Double_t maxPt, Bool_t& isBadPt)
 {
   // list of jet tracks from trackrefs
   
@@ -3362,7 +3453,7 @@ void  AliAnalysisTaskFragmentationFunction::AssociateGenRec(TList* tracksAODMCCh
 
 // _____________________________________________________________________________________________________________________________________________
 void AliAnalysisTaskFragmentationFunction::FillSingleTrackHistosRecGen(AliFragFuncQATrackHistos* trackQAGen, AliFragFuncQATrackHistos* trackQARec, TList* tracksGen, 
-                                                                      const TArrayI& indexAODTr, const TArrayS& isRefGen, const Bool_t scaleStrangeness){
+                                                                      const TArrayI& indexAODTr, const TArrayS& isRefGen, Bool_t scaleStrangeness){
 
   // fill QA for single track reconstruction efficiency
   
@@ -3405,7 +3496,7 @@ void AliAnalysisTaskFragmentationFunction::FillSingleTrackHistosRecGen(AliFragFu
 
 void  AliAnalysisTaskFragmentationFunction::FillJetTrackHistosRec(AliFragFuncHistos* ffhistRec, AliAODJet* jet, 
                                                                  TList* jetTrackList, const TList* tracksGen, const TList* tracksRec, const TArrayI& indexAODTr,
-                                                                 const TArrayS& isRefGen, TList* jetTrackListTR, const Bool_t scaleStrangeness,
+                                                                 const TArrayS& isRefGen, TList* jetTrackListTR, Bool_t scaleStrangeness,
                                                                  Bool_t fillJS, TProfile* hProNtracksLeadingJet, TProfile** hProDelRPtSum, TProfile* hProDelR80pcPt)
 {
   // fill objects for jet track reconstruction efficiency or secondaries contamination 
@@ -3823,7 +3914,7 @@ void AliAnalysisTaskFragmentationFunction::GetTracksOutOfNJetsStat(Int_t nCases,
 }
 
 // ______________________________________________________________________________________________________________________________________________________
-Float_t AliAnalysisTaskFragmentationFunction::CalcJetArea(const Float_t etaJet, const Float_t rc) const
+Float_t AliAnalysisTaskFragmentationFunction::CalcJetArea(Float_t etaJet, Float_t rc) const
 {
   // calculate area of jet with eta etaJet and radius rc
 
@@ -3937,17 +4028,17 @@ void AliAnalysisTaskFragmentationFunction::GetClusterTracksMedian(TList* outputl
   // get median cluster
 
   AliAODJet* medianCluster = 0;
-  Double_t   medianDensity = 0;
+  //Double_t   medianDensity = 0;
 
   if(TMath::Odd(nBckgClusters)){
     
     Int_t medianIndex = indices[(Int_t) (0.5*(nBckgClusters-1))];
     medianCluster = (AliAODJet*)(fBckgJetsRec->At(medianIndex));
     
-    Double_t clusterPt = medianCluster->Pt();
-    Double_t area      = medianCluster->EffectiveAreaCharged();
+    //Double_t clusterPt = medianCluster->Pt();
+    //Double_t area      = medianCluster->EffectiveAreaCharged();
     
-    if(area>0) medianDensity = clusterPt/area;
+    //if(area>0) medianDensity = clusterPt/area;
   }
   else{
 
@@ -3957,17 +4048,17 @@ void AliAnalysisTaskFragmentationFunction::GetClusterTracksMedian(TList* outputl
     AliAODJet* medianCluster1 = (AliAODJet*)(fBckgJetsRec->At(medianIndex1));
     AliAODJet* medianCluster2 = (AliAODJet*)(fBckgJetsRec->At(medianIndex2));
     
-    Double_t density1 = 0;
-    Double_t clusterPt1 = medianCluster1->Pt();
-    Double_t area1      = medianCluster1->EffectiveAreaCharged();
-    if(area1>0) density1 = clusterPt1/area1;
+    //Double_t density1 = 0;
+    //Double_t clusterPt1 = medianCluster1->Pt();
+    //Double_t area1      = medianCluster1->EffectiveAreaCharged();
+    //if(area1>0) density1 = clusterPt1/area1;
     
-    Double_t density2 = 0;
-    Double_t clusterPt2 = medianCluster2->Pt();
-    Double_t area2      = medianCluster2->EffectiveAreaCharged();
-    if(area2>0) density2 = clusterPt2/area2;
+    //Double_t density2 = 0;
+    //Double_t clusterPt2 = medianCluster2->Pt();
+    //Double_t area2      = medianCluster2->EffectiveAreaCharged();
+    //if(area2>0) density2 = clusterPt2/area2;
     
-    medianDensity = 0.5*(density1+density2);
+    //medianDensity = 0.5*(density1+density2);
     
     medianCluster = ( (fRandom->Rndm()>0.5) ? medianCluster1 : medianCluster2 );  // select one randomly to avoid adding areas
   }
@@ -4560,7 +4651,7 @@ void AliAnalysisTaskFragmentationFunction::FillBckgHistos(Int_t type, TList* inp
 }
 
 //_____________________________________________________________________________________
-Double_t AliAnalysisTaskFragmentationFunction::GetMCStrangenessFactor(const Double_t pt)
+Double_t AliAnalysisTaskFragmentationFunction::GetMCStrangenessFactor(Double_t pt)
 {
   // factor strangeness data/MC as function of pt from UE analysis (Sara Vallero)
 
@@ -4637,7 +4728,7 @@ Double_t AliAnalysisTaskFragmentationFunction::GetMCStrangenessFactorCMS(AliAODM
 
   Double_t fac = 1;
 
-  if(motherPDG == 310 || TMath::Abs(motherPDG)==321){ // K0s / K+ / K-
+  if(TMath::Abs(motherPDG) == 310 || TMath::Abs(motherPDG)==321){ // K0s / K+ / K-
 
     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.768049;
     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.732933;
@@ -4665,7 +4756,7 @@ Double_t AliAnalysisTaskFragmentationFunction::GetMCStrangenessFactorCMS(AliAODM
     else if(8.00 <= motherPt && motherPt < 10.00) fac = 0.835865;
   }
 
-  if(motherPDG == 3122){ // Lambda
+  if(TMath::Abs(motherPDG) == 3122){ // Lambda
 
     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.645162;
     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.627431;
@@ -4693,7 +4784,7 @@ Double_t AliAnalysisTaskFragmentationFunction::GetMCStrangenessFactorCMS(AliAODM
     else if(8.00 <= motherPt && motherPt < 10.00) fac = 1.020021;
   }    
   
-  if(motherPDG == 3312 || motherPDG == 3322){ // xi 
+  if(TMath::Abs(motherPDG) == 3312 || TMath::Abs(motherPDG) == 3322){ // xi 
 
     if(0.00 <= motherPt && motherPt < 0.20) fac = 0.666620;
     else if(0.20 <= motherPt && motherPt < 0.40) fac = 0.575908;