ROOT logo
//
// Emcal particle class, which can contain either an AliVTrack or an AliVCluster
//
// Author: S.Aiola

#include "AliEmcalParticle.h"
#include "AliVCluster.h"
#include "AliLog.h"

//_________________________________________________________________________________________________
AliEmcalParticle::AliEmcalParticle() :
  AliVParticle(),
  fTrack(0), 
  fCluster(0),
  fNMatched(0),
  fId(-1),
  fPhi(0),
  fEta(0),
  fPt(0),
  fMatchedPtr(0)
{
  // Default constructor.

  ResetMatchedObjects();
}

//_________________________________________________________________________________________________
AliEmcalParticle::AliEmcalParticle(TObject *particle, Int_t id, Double_t vx, Double_t vy, Double_t vz) :
  AliVParticle(),
  fTrack(0), 
  fCluster(0),
  fNMatched(0),
  fId(id),
  fPhi(0),
  fEta(0),
  fPt(0),
  fMatchedPtr(0)
{
  // Constructor.

  if (!particle) {
    AliWarning("Null pointer passed as particle.");
    return;
  }

  fTrack = dynamic_cast<AliVTrack*>(particle);
  if (fTrack) {
    fEta = fTrack->Eta();
    fPhi = fTrack->Phi();
    fPt = fTrack->Pt();
  } else {
    fCluster = dynamic_cast<AliVCluster*>(particle);
    if (fCluster) {
      Double_t vtx[3]; vtx[0]=vx;vtx[1]=vy;vtx[2]=vz;
      TLorentzVector vect;
      fCluster->GetMomentum(vect, vtx);
      fEta = vect.Eta();
      fPhi = vect.Phi();
      fPt  = vect.Pt();
    }
  }

  if (!fTrack && !fCluster) {
    AliWarning("Particle type not recognized (not AliVTrack nor AliVCluster).");
    return;
  }

  ResetMatchedObjects();
}
  
//_________________________________________________________________________________________________
AliEmcalParticle::AliEmcalParticle(const AliEmcalParticle &p) :
  AliVParticle(p),
  fTrack(p.fTrack),
  fCluster(p.fCluster), 
  fNMatched(p.fNMatched),
  fId(p.fId),
  fPhi(p.fPhi),
  fEta(p.fEta),
  fPt(p.fPt),
  fMatchedPtr(p.fMatchedPtr)
{
  // Copy constructor.

  ResetMatchedObjects();

  memcpy(fMatchedIds, p.fMatchedIds, sizeof(UShort_t) * fSizeMatched);
  memcpy(fMatchedDist, p.fMatchedDist, sizeof(Double_t) * fSizeMatched);
}

//_________________________________________________________________________________________________
AliEmcalParticle::~AliEmcalParticle()
{
  // Destructor.
}

//_________________________________________________________________________________________________
AliEmcalParticle &AliEmcalParticle::operator=(const AliEmcalParticle &p)
{
  // Assignment operator.

  if (this != &p) {
    fTrack      = p.fTrack;
    fCluster    = p.fCluster;
    fNMatched   = p.fNMatched;
    fId         = p.fId;
    fPhi        = p.fPhi;
    fEta        = p.fEta;
    fPt         = p.fPt;
    fMatchedPtr = p.fMatchedPtr;

    ResetMatchedObjects();
    memcpy(fMatchedIds,  p.fMatchedIds,  sizeof(UShort_t) * fSizeMatched);
    memcpy(fMatchedDist, p.fMatchedDist, sizeof(Double_t) * fSizeMatched);
  }

  return *this;
}

//_________________________________________________________________________________________________
void AliEmcalParticle::ResetMatchedObjects()
{
  // Reset matched objects.

  for (Int_t i = 0; i < fSizeMatched; i++) {
    fMatchedIds[i] = -1;
    fMatchedDist[i] = 999;
  }
}

//_________________________________________________________________________________________________
void AliEmcalParticle::AddMatchedObj(Int_t id, Double_t d)
{
  // Add a matched object.

  Int_t i = 0;
  while (i < fNMatched && d > fMatchedDist[i])
    ++i;
  
  if (i < fNMatched) {
    memmove(fMatchedIds  + i + 1, fMatchedIds  + i, sizeof(UShort_t) * (fNMatched - i));
    memmove(fMatchedDist + i + 1, fMatchedDist + i, sizeof(Double_t) * (fNMatched - i));
  }
  
  fMatchedIds[i]  = id;
  fMatchedDist[i] = d;
  ++fNMatched;

  if (fNMatched >= fSizeMatched)
    fNMatched = fSizeMatched - 1;
}

//_________________________________________________________________________________________________
TLorentzVector &AliEmcalParticle::GetLorentzVector(const Double_t *vertex) const
{
  // Make a TLorentzVector and return it.

  static TLorentzVector vect;

  if (fTrack) {
    vect.SetPtEtaPhiM(fTrack->Pt(), fTrack->Eta(), fTrack->Phi(), M());
  }
  else if (fCluster && vertex) {
    fCluster->GetMomentum(vect, const_cast<Double_t*>(vertex));
  }

  return vect;
}
 AliEmcalParticle.cxx:1
 AliEmcalParticle.cxx:2
 AliEmcalParticle.cxx:3
 AliEmcalParticle.cxx:4
 AliEmcalParticle.cxx:5
 AliEmcalParticle.cxx:6
 AliEmcalParticle.cxx:7
 AliEmcalParticle.cxx:8
 AliEmcalParticle.cxx:9
 AliEmcalParticle.cxx:10
 AliEmcalParticle.cxx:11
 AliEmcalParticle.cxx:12
 AliEmcalParticle.cxx:13
 AliEmcalParticle.cxx:14
 AliEmcalParticle.cxx:15
 AliEmcalParticle.cxx:16
 AliEmcalParticle.cxx:17
 AliEmcalParticle.cxx:18
 AliEmcalParticle.cxx:19
 AliEmcalParticle.cxx:20
 AliEmcalParticle.cxx:21
 AliEmcalParticle.cxx:22
 AliEmcalParticle.cxx:23
 AliEmcalParticle.cxx:24
 AliEmcalParticle.cxx:25
 AliEmcalParticle.cxx:26
 AliEmcalParticle.cxx:27
 AliEmcalParticle.cxx:28
 AliEmcalParticle.cxx:29
 AliEmcalParticle.cxx:30
 AliEmcalParticle.cxx:31
 AliEmcalParticle.cxx:32
 AliEmcalParticle.cxx:33
 AliEmcalParticle.cxx:34
 AliEmcalParticle.cxx:35
 AliEmcalParticle.cxx:36
 AliEmcalParticle.cxx:37
 AliEmcalParticle.cxx:38
 AliEmcalParticle.cxx:39
 AliEmcalParticle.cxx:40
 AliEmcalParticle.cxx:41
 AliEmcalParticle.cxx:42
 AliEmcalParticle.cxx:43
 AliEmcalParticle.cxx:44
 AliEmcalParticle.cxx:45
 AliEmcalParticle.cxx:46
 AliEmcalParticle.cxx:47
 AliEmcalParticle.cxx:48
 AliEmcalParticle.cxx:49
 AliEmcalParticle.cxx:50
 AliEmcalParticle.cxx:51
 AliEmcalParticle.cxx:52
 AliEmcalParticle.cxx:53
 AliEmcalParticle.cxx:54
 AliEmcalParticle.cxx:55
 AliEmcalParticle.cxx:56
 AliEmcalParticle.cxx:57
 AliEmcalParticle.cxx:58
 AliEmcalParticle.cxx:59
 AliEmcalParticle.cxx:60
 AliEmcalParticle.cxx:61
 AliEmcalParticle.cxx:62
 AliEmcalParticle.cxx:63
 AliEmcalParticle.cxx:64
 AliEmcalParticle.cxx:65
 AliEmcalParticle.cxx:66
 AliEmcalParticle.cxx:67
 AliEmcalParticle.cxx:68
 AliEmcalParticle.cxx:69
 AliEmcalParticle.cxx:70
 AliEmcalParticle.cxx:71
 AliEmcalParticle.cxx:72
 AliEmcalParticle.cxx:73
 AliEmcalParticle.cxx:74
 AliEmcalParticle.cxx:75
 AliEmcalParticle.cxx:76
 AliEmcalParticle.cxx:77
 AliEmcalParticle.cxx:78
 AliEmcalParticle.cxx:79
 AliEmcalParticle.cxx:80
 AliEmcalParticle.cxx:81
 AliEmcalParticle.cxx:82
 AliEmcalParticle.cxx:83
 AliEmcalParticle.cxx:84
 AliEmcalParticle.cxx:85
 AliEmcalParticle.cxx:86
 AliEmcalParticle.cxx:87
 AliEmcalParticle.cxx:88
 AliEmcalParticle.cxx:89
 AliEmcalParticle.cxx:90
 AliEmcalParticle.cxx:91
 AliEmcalParticle.cxx:92
 AliEmcalParticle.cxx:93
 AliEmcalParticle.cxx:94
 AliEmcalParticle.cxx:95
 AliEmcalParticle.cxx:96
 AliEmcalParticle.cxx:97
 AliEmcalParticle.cxx:98
 AliEmcalParticle.cxx:99
 AliEmcalParticle.cxx:100
 AliEmcalParticle.cxx:101
 AliEmcalParticle.cxx:102
 AliEmcalParticle.cxx:103
 AliEmcalParticle.cxx:104
 AliEmcalParticle.cxx:105
 AliEmcalParticle.cxx:106
 AliEmcalParticle.cxx:107
 AliEmcalParticle.cxx:108
 AliEmcalParticle.cxx:109
 AliEmcalParticle.cxx:110
 AliEmcalParticle.cxx:111
 AliEmcalParticle.cxx:112
 AliEmcalParticle.cxx:113
 AliEmcalParticle.cxx:114
 AliEmcalParticle.cxx:115
 AliEmcalParticle.cxx:116
 AliEmcalParticle.cxx:117
 AliEmcalParticle.cxx:118
 AliEmcalParticle.cxx:119
 AliEmcalParticle.cxx:120
 AliEmcalParticle.cxx:121
 AliEmcalParticle.cxx:122
 AliEmcalParticle.cxx:123
 AliEmcalParticle.cxx:124
 AliEmcalParticle.cxx:125
 AliEmcalParticle.cxx:126
 AliEmcalParticle.cxx:127
 AliEmcalParticle.cxx:128
 AliEmcalParticle.cxx:129
 AliEmcalParticle.cxx:130
 AliEmcalParticle.cxx:131
 AliEmcalParticle.cxx:132
 AliEmcalParticle.cxx:133
 AliEmcalParticle.cxx:134
 AliEmcalParticle.cxx:135
 AliEmcalParticle.cxx:136
 AliEmcalParticle.cxx:137
 AliEmcalParticle.cxx:138
 AliEmcalParticle.cxx:139
 AliEmcalParticle.cxx:140
 AliEmcalParticle.cxx:141
 AliEmcalParticle.cxx:142
 AliEmcalParticle.cxx:143
 AliEmcalParticle.cxx:144
 AliEmcalParticle.cxx:145
 AliEmcalParticle.cxx:146
 AliEmcalParticle.cxx:147
 AliEmcalParticle.cxx:148
 AliEmcalParticle.cxx:149
 AliEmcalParticle.cxx:150
 AliEmcalParticle.cxx:151
 AliEmcalParticle.cxx:152
 AliEmcalParticle.cxx:153
 AliEmcalParticle.cxx:154
 AliEmcalParticle.cxx:155
 AliEmcalParticle.cxx:156
 AliEmcalParticle.cxx:157
 AliEmcalParticle.cxx:158
 AliEmcalParticle.cxx:159
 AliEmcalParticle.cxx:160
 AliEmcalParticle.cxx:161
 AliEmcalParticle.cxx:162
 AliEmcalParticle.cxx:163
 AliEmcalParticle.cxx:164
 AliEmcalParticle.cxx:165
 AliEmcalParticle.cxx:166
 AliEmcalParticle.cxx:167
 AliEmcalParticle.cxx:168