+// ___________________________________________________________________________________________________________________________
+void AliAnalysisTaskFragmentationFunction::GetClusterTracksOutOf1Jet(AliAODJet* jet, TList* outputlist, Double_t &normFactor)
+{
+ // fill tracks from bckgCluster branch in list,
+ // for all clusters outside jet cone
+ // sum up total area of clusters
+
+ Double_t rc = GetFFRadius();
+ Double_t rcl = GetFFBckgRadius();
+
+ Double_t areaTotal = 0;
+ Double_t sumPtTotal = 0;
+
+ for(Int_t ij=0; ij<fBckgJetsRec->GetEntries(); ++ij){
+
+ AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij)); // not 'recCuts': use all clusters in full eta range
+
+ Double_t dR = jet->DeltaR(bgrCluster);
+
+ if(dR<rcl) continue;
+
+ Double_t clusterPt = bgrCluster->Pt();
+ Double_t area = bgrCluster->EffectiveAreaCharged();
+ areaTotal += area;
+ sumPtTotal += clusterPt;
+
+ Int_t nTracksJet = bgrCluster->GetRefTracks()->GetEntries();
+
+ for(Int_t it = 0; it<nTracksJet; it++){
+
+ AliVParticle* track = dynamic_cast<AliVParticle*>(bgrCluster->GetTrack(it));
+
+ Float_t trackPt = track->Pt();
+ Float_t trackEta = track->Eta();
+ Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
+
+ if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
+ if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
+ if(trackPt < fTrackPtCut) continue;
+
+ outputlist->Add(track);
+ }
+ }
+
+ Double_t areaJet = TMath::Pi()*rc*rc;
+ if(areaTotal) normFactor = (Float_t) 1./(areaJet / areaTotal);
+
+ outputlist->Sort();
+}
+
+// _______________________________________________________________________________________________________________________
+void AliAnalysisTaskFragmentationFunction::GetClusterTracksMedian(TList* outputlist, Double_t &normFactor)
+{
+ // fill tracks from bckgCluster branch,
+ // using cluster with median density (odd number of clusters)
+ // or picking randomly one of the two closest to median (even number)
+
+ Int_t nBckgClusters = fBckgJetsRec->GetEntries(); // not 'recCuts': use all clusters in full eta range
+
+ Double_t* bgrDensity = new Double_t[nBckgClusters];
+ Int_t* indices = new Int_t[nBckgClusters];
+
+ for(Int_t ij=0; ij<nBckgClusters; ++ij){
+
+ AliAODJet* bgrCluster = (AliAODJet*)(fBckgJetsRec->At(ij));
+ Double_t clusterPt = bgrCluster->Pt();
+ Double_t area = bgrCluster->EffectiveAreaCharged();
+
+ Double_t density = 0;
+ if(area>0) density = clusterPt/area;
+
+ bgrDensity[ij] = density;
+ indices[ij] = ij;
+ }
+
+ TMath::Sort(nBckgClusters, bgrDensity, indices);
+
+ // get median cluster
+
+ AliAODJet* medianCluster = 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();
+
+ if(area>0) medianDensity = clusterPt/area;
+ }
+ else{
+
+ Int_t medianIndex1 = indices[(Int_t) (0.5*nBckgClusters-1)];
+ Int_t medianIndex2 = indices[(Int_t) (0.5*nBckgClusters)];
+
+ 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 density2 = 0;
+ Double_t clusterPt2 = medianCluster2->Pt();
+ Double_t area2 = medianCluster2->EffectiveAreaCharged();
+ if(area2>0) density2 = clusterPt2/area2;
+
+ medianDensity = 0.5*(density1+density2);
+
+ medianCluster = ( (fRandom->Rndm()>0.5) ? medianCluster1 : medianCluster2 ); // select one randomly to avoid adding areas
+ }
+
+ Int_t nTracksJet = medianCluster->GetRefTracks()->GetEntries();
+
+ for(Int_t it = 0; it<nTracksJet; it++){
+
+ AliVParticle* track = dynamic_cast<AliVParticle*>(medianCluster->GetTrack(it));
+
+ Float_t trackPt = track->Pt();
+ Float_t trackEta = track->Eta();
+ Float_t trackPhi = TVector2::Phi_0_2pi(track->Phi());
+
+ if(trackEta < fTrackEtaMin || trackEta > fTrackEtaMax) continue;
+ if(trackPhi < fTrackPhiMin || trackPhi > fTrackPhiMax) continue;
+ if(trackPt < fTrackPtCut) continue;
+
+ outputlist->Add(track);
+ }
+
+ Double_t areaMedian = medianCluster->EffectiveAreaCharged();
+ Double_t areaJet = TMath::Pi()*GetFFRadius()*GetFFRadius();
+
+ if(areaMedian) normFactor = (Float_t) 1./(areaJet / areaMedian);
+
+ outputlist->Sort();
+
+ delete[] bgrDensity;
+ delete[] indices;
+}
+