ROOT logo
// $Id$
//
// Calculation of rho, method: median all particle pt / multiplicity density.
//
// Authors: S. Aiola

#include "AliAnalysisTaskRhoAverage.h"

#include <TClonesArray.h>
#include <TMath.h>

#include "AliLog.h"
#include "AliRhoParameter.h"
#include "AliVCluster.h"
#include "AliVTrack.h"
#include "AliParticleContainer.h"

ClassImp(AliAnalysisTaskRhoAverage)

//________________________________________________________________________
AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage() : 
  AliAnalysisTaskRhoBase("AliAnalysisTaskRhoAverage"),
  fRhoType(0),
  fNExclLeadPart(0),
  fUseMedian(kFALSE),
  fTotalArea(1)
{
  // Default constructor.
}

//________________________________________________________________________
AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage(const char *name, Bool_t histo) :
  AliAnalysisTaskRhoBase(name, histo),
  fRhoType(0),
  fNExclLeadPart(0),
  fUseMedian(kFALSE),
  fTotalArea(1)
{
  // Constructor.
}

//________________________________________________________________________
Bool_t AliAnalysisTaskRhoAverage::Run() 
{
  // Run the analysis.

  const Int_t NMAX = 9999;
  static Double_t rhovec[NMAX];
  Int_t NpartAcc = 0;

  Int_t   maxPartIds[] = {0, 0};
  Float_t maxPartPts[] = {0, 0};

  // push all jets within selected acceptance into stack

  if (fNExclLeadPart > 0) {

    if (fTracks && (fRhoType == 0 || fRhoType == 1)) {
      
      const Int_t Ntracks = fTracks->GetEntriesFast();
      
      for (Int_t it = 0; it < Ntracks; ++it) {
	
	AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it));
	
	if (!track) {
	  AliError(Form("%s: Could not receive track %d", GetName(), it));
	  continue;
	} 
	
	if (!AcceptTrack(track))
	  continue;
	
	if (track->Pt() > maxPartPts[0]) {
	  maxPartPts[1] = maxPartPts[0];
	  maxPartIds[1] = maxPartIds[0];
	  maxPartPts[0] = track->Pt();
	  maxPartIds[0] = it+1;
	} 
	else if (track->Pt() > maxPartPts[1]) {
	  maxPartPts[1] = track->Pt();
	  maxPartIds[1] = it+1;
	}
      }
    }

    if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) {

      const Int_t Nclusters = fCaloClusters->GetEntriesFast();
      
      for (Int_t ic = 0; ic < Nclusters; ++ic) {
	
	AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic));
	
	if (!cluster) {
	  AliError(Form("%s: Could not receive cluster %d", GetName(), ic));
	  continue;
	} 
	
	if (!AcceptCluster(cluster))
	  continue;
	
	TLorentzVector nPart;
	cluster->GetMomentum(nPart, fVertex);
	
	if (nPart.Pt() > maxPartPts[0]) {
	  maxPartPts[1] = maxPartPts[0];
	  maxPartIds[1] = maxPartIds[0];
	  maxPartPts[0] = nPart.Pt();
	  maxPartIds[0] = -ic-1;
	} 
	else if (nPart.Pt() > maxPartPts[1]) {
	  maxPartPts[1] = nPart.Pt();
	  maxPartIds[1] = -ic-1;
	}
      }
    }
 
    if (fNExclLeadPart < 2) {
      maxPartIds[1] = 0;
      maxPartPts[1] = 0;
    }
  }
  
  if (fTracks && (fRhoType == 0 || fRhoType == 1)) {

    const Int_t Ntracks = fTracks->GetEntriesFast();

    for (Int_t it = 0; it < Ntracks && NpartAcc < NMAX; ++it) {

      // exlcuding lead particles
      if (it == maxPartIds[0]-1 || it == maxPartIds[1]-1)
	continue;
      
      AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it));
  
      if (!track) {
	AliError(Form("%s: Could not receive track %d", GetName(), it));
	continue;
      } 

      if (!AcceptTrack(track))
	continue;

      rhovec[NpartAcc] = track->Pt();
      ++NpartAcc;
    }
  }

  if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) {

    const Int_t Nclusters = fCaloClusters->GetEntriesFast();

    for (Int_t ic = 0; ic < Nclusters && NpartAcc < NMAX; ++ic) {

      // exlcuding lead particles
      if (ic == -maxPartIds[0]-1 || ic == -maxPartIds[1]-1)
	continue;
      
      AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic));
      
      if (!cluster) {
	AliError(Form("%s: Could not receive cluster %d", GetName(), ic));
	continue;
      } 
      
      if (!AcceptCluster(cluster))
	continue;
      
      TLorentzVector nPart;
      cluster->GetMomentum(nPart, fVertex);

      rhovec[NpartAcc] = nPart.Pt();
      ++NpartAcc;
    }
  }

  if (NpartAcc == NMAX) {
    AliError(Form("%s: NpartAcc >= %d", GetName(), NMAX));
  }

  Double_t rho = 0;
  
  if (NpartAcc > 0) {
    if (fUseMedian)
      rho = TMath::Median(NpartAcc, rhovec);
    else
      rho = TMath::Mean(NpartAcc, rhovec);
    
    rho *= NpartAcc / fTotalArea;
  }

  fOutRho->SetVal(rho);

  if (fScaleFunction) {
    Double_t rhoScaled = rho * GetScaleFactor(fCent);
    fOutRhoScaled->SetVal(rhoScaled);
  }

  return kTRUE;
}

//________________________________________________________________________
void AliAnalysisTaskRhoAverage::ExecOnce() 
{
  AliAnalysisTaskRhoBase::ExecOnce();

  AliParticleContainer *partCont = GetParticleContainer(0);
  if (!partCont) {
    AliError(Form("%s: No particle container found! Assuming area = 1...",GetName()));
    fTotalArea = 1;
    return;
  }

  Float_t maxEta = partCont->GetParticleEtaMax();
  Float_t minEta = partCont->GetParticleEtaMin();
  Float_t maxPhi = partCont->GetParticlePhiMax();
  Float_t minPhi = partCont->GetParticlePhiMin();
  
  if (maxPhi > TMath::Pi() * 2) maxPhi = TMath::Pi() * 2;
  if (minPhi < 0) minPhi = 0;
  
  fTotalArea = (maxEta - minEta) * (maxPhi - minPhi);

  if (fTotalArea < 1e-6) {
    AliError(Form("%s: Area = %f < 1e-6, assuming area = 1", GetName(), fTotalArea));
    fTotalArea = 1;
  }
}
 AliAnalysisTaskRhoAverage.cxx:1
 AliAnalysisTaskRhoAverage.cxx:2
 AliAnalysisTaskRhoAverage.cxx:3
 AliAnalysisTaskRhoAverage.cxx:4
 AliAnalysisTaskRhoAverage.cxx:5
 AliAnalysisTaskRhoAverage.cxx:6
 AliAnalysisTaskRhoAverage.cxx:7
 AliAnalysisTaskRhoAverage.cxx:8
 AliAnalysisTaskRhoAverage.cxx:9
 AliAnalysisTaskRhoAverage.cxx:10
 AliAnalysisTaskRhoAverage.cxx:11
 AliAnalysisTaskRhoAverage.cxx:12
 AliAnalysisTaskRhoAverage.cxx:13
 AliAnalysisTaskRhoAverage.cxx:14
 AliAnalysisTaskRhoAverage.cxx:15
 AliAnalysisTaskRhoAverage.cxx:16
 AliAnalysisTaskRhoAverage.cxx:17
 AliAnalysisTaskRhoAverage.cxx:18
 AliAnalysisTaskRhoAverage.cxx:19
 AliAnalysisTaskRhoAverage.cxx:20
 AliAnalysisTaskRhoAverage.cxx:21
 AliAnalysisTaskRhoAverage.cxx:22
 AliAnalysisTaskRhoAverage.cxx:23
 AliAnalysisTaskRhoAverage.cxx:24
 AliAnalysisTaskRhoAverage.cxx:25
 AliAnalysisTaskRhoAverage.cxx:26
 AliAnalysisTaskRhoAverage.cxx:27
 AliAnalysisTaskRhoAverage.cxx:28
 AliAnalysisTaskRhoAverage.cxx:29
 AliAnalysisTaskRhoAverage.cxx:30
 AliAnalysisTaskRhoAverage.cxx:31
 AliAnalysisTaskRhoAverage.cxx:32
 AliAnalysisTaskRhoAverage.cxx:33
 AliAnalysisTaskRhoAverage.cxx:34
 AliAnalysisTaskRhoAverage.cxx:35
 AliAnalysisTaskRhoAverage.cxx:36
 AliAnalysisTaskRhoAverage.cxx:37
 AliAnalysisTaskRhoAverage.cxx:38
 AliAnalysisTaskRhoAverage.cxx:39
 AliAnalysisTaskRhoAverage.cxx:40
 AliAnalysisTaskRhoAverage.cxx:41
 AliAnalysisTaskRhoAverage.cxx:42
 AliAnalysisTaskRhoAverage.cxx:43
 AliAnalysisTaskRhoAverage.cxx:44
 AliAnalysisTaskRhoAverage.cxx:45
 AliAnalysisTaskRhoAverage.cxx:46
 AliAnalysisTaskRhoAverage.cxx:47
 AliAnalysisTaskRhoAverage.cxx:48
 AliAnalysisTaskRhoAverage.cxx:49
 AliAnalysisTaskRhoAverage.cxx:50
 AliAnalysisTaskRhoAverage.cxx:51
 AliAnalysisTaskRhoAverage.cxx:52
 AliAnalysisTaskRhoAverage.cxx:53
 AliAnalysisTaskRhoAverage.cxx:54
 AliAnalysisTaskRhoAverage.cxx:55
 AliAnalysisTaskRhoAverage.cxx:56
 AliAnalysisTaskRhoAverage.cxx:57
 AliAnalysisTaskRhoAverage.cxx:58
 AliAnalysisTaskRhoAverage.cxx:59
 AliAnalysisTaskRhoAverage.cxx:60
 AliAnalysisTaskRhoAverage.cxx:61
 AliAnalysisTaskRhoAverage.cxx:62
 AliAnalysisTaskRhoAverage.cxx:63
 AliAnalysisTaskRhoAverage.cxx:64
 AliAnalysisTaskRhoAverage.cxx:65
 AliAnalysisTaskRhoAverage.cxx:66
 AliAnalysisTaskRhoAverage.cxx:67
 AliAnalysisTaskRhoAverage.cxx:68
 AliAnalysisTaskRhoAverage.cxx:69
 AliAnalysisTaskRhoAverage.cxx:70
 AliAnalysisTaskRhoAverage.cxx:71
 AliAnalysisTaskRhoAverage.cxx:72
 AliAnalysisTaskRhoAverage.cxx:73
 AliAnalysisTaskRhoAverage.cxx:74
 AliAnalysisTaskRhoAverage.cxx:75
 AliAnalysisTaskRhoAverage.cxx:76
 AliAnalysisTaskRhoAverage.cxx:77
 AliAnalysisTaskRhoAverage.cxx:78
 AliAnalysisTaskRhoAverage.cxx:79
 AliAnalysisTaskRhoAverage.cxx:80
 AliAnalysisTaskRhoAverage.cxx:81
 AliAnalysisTaskRhoAverage.cxx:82
 AliAnalysisTaskRhoAverage.cxx:83
 AliAnalysisTaskRhoAverage.cxx:84
 AliAnalysisTaskRhoAverage.cxx:85
 AliAnalysisTaskRhoAverage.cxx:86
 AliAnalysisTaskRhoAverage.cxx:87
 AliAnalysisTaskRhoAverage.cxx:88
 AliAnalysisTaskRhoAverage.cxx:89
 AliAnalysisTaskRhoAverage.cxx:90
 AliAnalysisTaskRhoAverage.cxx:91
 AliAnalysisTaskRhoAverage.cxx:92
 AliAnalysisTaskRhoAverage.cxx:93
 AliAnalysisTaskRhoAverage.cxx:94
 AliAnalysisTaskRhoAverage.cxx:95
 AliAnalysisTaskRhoAverage.cxx:96
 AliAnalysisTaskRhoAverage.cxx:97
 AliAnalysisTaskRhoAverage.cxx:98
 AliAnalysisTaskRhoAverage.cxx:99
 AliAnalysisTaskRhoAverage.cxx:100
 AliAnalysisTaskRhoAverage.cxx:101
 AliAnalysisTaskRhoAverage.cxx:102
 AliAnalysisTaskRhoAverage.cxx:103
 AliAnalysisTaskRhoAverage.cxx:104
 AliAnalysisTaskRhoAverage.cxx:105
 AliAnalysisTaskRhoAverage.cxx:106
 AliAnalysisTaskRhoAverage.cxx:107
 AliAnalysisTaskRhoAverage.cxx:108
 AliAnalysisTaskRhoAverage.cxx:109
 AliAnalysisTaskRhoAverage.cxx:110
 AliAnalysisTaskRhoAverage.cxx:111
 AliAnalysisTaskRhoAverage.cxx:112
 AliAnalysisTaskRhoAverage.cxx:113
 AliAnalysisTaskRhoAverage.cxx:114
 AliAnalysisTaskRhoAverage.cxx:115
 AliAnalysisTaskRhoAverage.cxx:116
 AliAnalysisTaskRhoAverage.cxx:117
 AliAnalysisTaskRhoAverage.cxx:118
 AliAnalysisTaskRhoAverage.cxx:119
 AliAnalysisTaskRhoAverage.cxx:120
 AliAnalysisTaskRhoAverage.cxx:121
 AliAnalysisTaskRhoAverage.cxx:122
 AliAnalysisTaskRhoAverage.cxx:123
 AliAnalysisTaskRhoAverage.cxx:124
 AliAnalysisTaskRhoAverage.cxx:125
 AliAnalysisTaskRhoAverage.cxx:126
 AliAnalysisTaskRhoAverage.cxx:127
 AliAnalysisTaskRhoAverage.cxx:128
 AliAnalysisTaskRhoAverage.cxx:129
 AliAnalysisTaskRhoAverage.cxx:130
 AliAnalysisTaskRhoAverage.cxx:131
 AliAnalysisTaskRhoAverage.cxx:132
 AliAnalysisTaskRhoAverage.cxx:133
 AliAnalysisTaskRhoAverage.cxx:134
 AliAnalysisTaskRhoAverage.cxx:135
 AliAnalysisTaskRhoAverage.cxx:136
 AliAnalysisTaskRhoAverage.cxx:137
 AliAnalysisTaskRhoAverage.cxx:138
 AliAnalysisTaskRhoAverage.cxx:139
 AliAnalysisTaskRhoAverage.cxx:140
 AliAnalysisTaskRhoAverage.cxx:141
 AliAnalysisTaskRhoAverage.cxx:142
 AliAnalysisTaskRhoAverage.cxx:143
 AliAnalysisTaskRhoAverage.cxx:144
 AliAnalysisTaskRhoAverage.cxx:145
 AliAnalysisTaskRhoAverage.cxx:146
 AliAnalysisTaskRhoAverage.cxx:147
 AliAnalysisTaskRhoAverage.cxx:148
 AliAnalysisTaskRhoAverage.cxx:149
 AliAnalysisTaskRhoAverage.cxx:150
 AliAnalysisTaskRhoAverage.cxx:151
 AliAnalysisTaskRhoAverage.cxx:152
 AliAnalysisTaskRhoAverage.cxx:153
 AliAnalysisTaskRhoAverage.cxx:154
 AliAnalysisTaskRhoAverage.cxx:155
 AliAnalysisTaskRhoAverage.cxx:156
 AliAnalysisTaskRhoAverage.cxx:157
 AliAnalysisTaskRhoAverage.cxx:158
 AliAnalysisTaskRhoAverage.cxx:159
 AliAnalysisTaskRhoAverage.cxx:160
 AliAnalysisTaskRhoAverage.cxx:161
 AliAnalysisTaskRhoAverage.cxx:162
 AliAnalysisTaskRhoAverage.cxx:163
 AliAnalysisTaskRhoAverage.cxx:164
 AliAnalysisTaskRhoAverage.cxx:165
 AliAnalysisTaskRhoAverage.cxx:166
 AliAnalysisTaskRhoAverage.cxx:167
 AliAnalysisTaskRhoAverage.cxx:168
 AliAnalysisTaskRhoAverage.cxx:169
 AliAnalysisTaskRhoAverage.cxx:170
 AliAnalysisTaskRhoAverage.cxx:171
 AliAnalysisTaskRhoAverage.cxx:172
 AliAnalysisTaskRhoAverage.cxx:173
 AliAnalysisTaskRhoAverage.cxx:174
 AliAnalysisTaskRhoAverage.cxx:175
 AliAnalysisTaskRhoAverage.cxx:176
 AliAnalysisTaskRhoAverage.cxx:177
 AliAnalysisTaskRhoAverage.cxx:178
 AliAnalysisTaskRhoAverage.cxx:179
 AliAnalysisTaskRhoAverage.cxx:180
 AliAnalysisTaskRhoAverage.cxx:181
 AliAnalysisTaskRhoAverage.cxx:182
 AliAnalysisTaskRhoAverage.cxx:183
 AliAnalysisTaskRhoAverage.cxx:184
 AliAnalysisTaskRhoAverage.cxx:185
 AliAnalysisTaskRhoAverage.cxx:186
 AliAnalysisTaskRhoAverage.cxx:187
 AliAnalysisTaskRhoAverage.cxx:188
 AliAnalysisTaskRhoAverage.cxx:189
 AliAnalysisTaskRhoAverage.cxx:190
 AliAnalysisTaskRhoAverage.cxx:191
 AliAnalysisTaskRhoAverage.cxx:192
 AliAnalysisTaskRhoAverage.cxx:193
 AliAnalysisTaskRhoAverage.cxx:194
 AliAnalysisTaskRhoAverage.cxx:195
 AliAnalysisTaskRhoAverage.cxx:196
 AliAnalysisTaskRhoAverage.cxx:197
 AliAnalysisTaskRhoAverage.cxx:198
 AliAnalysisTaskRhoAverage.cxx:199
 AliAnalysisTaskRhoAverage.cxx:200
 AliAnalysisTaskRhoAverage.cxx:201
 AliAnalysisTaskRhoAverage.cxx:202
 AliAnalysisTaskRhoAverage.cxx:203
 AliAnalysisTaskRhoAverage.cxx:204
 AliAnalysisTaskRhoAverage.cxx:205
 AliAnalysisTaskRhoAverage.cxx:206
 AliAnalysisTaskRhoAverage.cxx:207
 AliAnalysisTaskRhoAverage.cxx:208
 AliAnalysisTaskRhoAverage.cxx:209
 AliAnalysisTaskRhoAverage.cxx:210
 AliAnalysisTaskRhoAverage.cxx:211
 AliAnalysisTaskRhoAverage.cxx:212
 AliAnalysisTaskRhoAverage.cxx:213
 AliAnalysisTaskRhoAverage.cxx:214
 AliAnalysisTaskRhoAverage.cxx:215
 AliAnalysisTaskRhoAverage.cxx:216
 AliAnalysisTaskRhoAverage.cxx:217
 AliAnalysisTaskRhoAverage.cxx:218
 AliAnalysisTaskRhoAverage.cxx:219
 AliAnalysisTaskRhoAverage.cxx:220
 AliAnalysisTaskRhoAverage.cxx:221
 AliAnalysisTaskRhoAverage.cxx:222
 AliAnalysisTaskRhoAverage.cxx:223
 AliAnalysisTaskRhoAverage.cxx:224
 AliAnalysisTaskRhoAverage.cxx:225
 AliAnalysisTaskRhoAverage.cxx:226
 AliAnalysisTaskRhoAverage.cxx:227
 AliAnalysisTaskRhoAverage.cxx:228
 AliAnalysisTaskRhoAverage.cxx:229