ROOT logo
/*************************************************************************
* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

///////////////////////////////////////////////////////////////////////////
//                Dielectron Event                                  //
//                                                                       //
//                                                                       //
/*
Detailed description


*/
//                                                                       //
///////////////////////////////////////////////////////////////////////////

#include <TObjArray.h>
#include <TExMap.h>
#include <TProcessID.h>

#include <AliVTrack.h>
#include <AliESDtrack.h>
#include <AliAODTrack.h>

#include "AliDielectronEvent.h"

ClassImp(AliDielectronEvent)

AliDielectronEvent::AliDielectronEvent() :
  TNamed(),
  fArrTrackP(),
  fArrTrackN(),
  fArrVertex("AliAODVertex",10),
  fArrPairs("AliKFParticle",0),
  fNTracksP(0),
  fNTracksN(0),
  fIsAOD(kFALSE),
  fEventData(),
  fPID(0x0),
  fPIDIndex(0)
{
  //
  // Default Constructor
  //
  
}

//______________________________________________
AliDielectronEvent::AliDielectronEvent(const char* name, const char* title) :
  TNamed(name, title),
  fArrTrackP(),
  fArrTrackN(),
  fArrVertex("AliAODVertex",10),
  fArrPairs("AliKFParticle",0),
  fNTracksP(0),
  fNTracksN(0),
  fIsAOD(kFALSE),
  fEventData(),
  fPID(0x0),
  fPIDIndex(0)
{
  //
  // Named Constructor
  //
}

//______________________________________________
AliDielectronEvent::~AliDielectronEvent()
{
  //
  // Default Destructor
  //
  fArrTrackP.Delete();
  fArrTrackN.Delete();
  fArrVertex.Delete();
  fArrPairs.Delete();
}

//______________________________________________
void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN, const TObjArray &/*arrPairs*/)
{
  //
  // Setup AliKFParticles
  // assumes that the objects in arrP and arrN are AliVTracks
  //

  //Clear out old entries before filling new ones
  Clear();
  // we keep the tracks buffered to minimise new / delete operations
  fNTracksN=0;
  fNTracksP=0;

  //check size of the arrays
  if (fArrTrackP.GetSize()<arrP.GetSize()) {
    fArrTrackP.Expand(arrP.GetSize());
  }
  if (fArrTrackN.GetSize()<arrN.GetSize()) {
    fArrTrackN.Expand(arrN.GetSize());
  }

  TExMap mapStoredVertices;
  fPIDIndex=TProcessID::GetPIDs()->IndexOf(fPID);
  // fill particles
  Int_t tracks=0;
  for (Int_t itrack=0; itrack<arrP.GetEntriesFast(); ++itrack){
    if (!fIsAOD){
      AliESDtrack *track=dynamic_cast<AliESDtrack*>(arrP.At(itrack));
      if (!track) continue;
      new (fArrTrackP[tracks]) AliESDtrack(*track);
      ++tracks;
    } else {
      AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrP.At(itrack));
      if (!track) continue;

      // buffer track
      AliAODTrack   *ctrack = new (fArrTrackP[tracks]) AliAODTrack(*track);

      // buffer vertex, don't duplicate
      // most particles will be assiciated to the primary vertex ...
      AliAODVertex *vtx=track->GetProdVertex();
      AliAODVertex *cvertex = 0x0;
      if (vtx){
        cvertex = reinterpret_cast<AliAODVertex*>(mapStoredVertices.GetValue(reinterpret_cast<ULong64_t>(vtx)));
        if (!cvertex) {
          if (mapStoredVertices.Capacity()<=mapStoredVertices.GetSize()) mapStoredVertices.Expand(2*mapStoredVertices.GetSize());
          if (fArrVertex.GetSize()<=fArrVertex.GetEntriesFast()) fArrVertex.Expand(2*fArrVertex.GetSize());
          cvertex = new (fArrVertex[fArrVertex.GetEntriesFast()]) AliAODVertex(*vtx);
          AssignID(cvertex);
          mapStoredVertices.Add(reinterpret_cast<ULong64_t>(vtx),reinterpret_cast<ULong64_t>(cvertex));
        }
      }
      ctrack->SetProdVertex(cvertex);
      ++tracks;
    }
  }
  fNTracksP=tracks;

  tracks=0;
  for (Int_t itrack=0; itrack<arrN.GetEntriesFast(); ++itrack){
    if (!fIsAOD){
      AliESDtrack *track=dynamic_cast<AliESDtrack*>(arrN.At(itrack));
      if (!track) continue;
      new (fArrTrackN[tracks]) AliESDtrack(*track);
      ++tracks;
    } else {
      AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrN.At(itrack));
      if (!track) continue;

      //buffer track
      AliAODTrack   *ctrack = new (fArrTrackN[tracks]) AliAODTrack(*track);
      
      // buffer vertex, don't duplicate
      // most particles will be assiciated to the primary vertex ...
      AliAODVertex *vtx=track->GetProdVertex();
      AliAODVertex *cvertex = 0x0;
      if (vtx){
        cvertex = reinterpret_cast<AliAODVertex*>(mapStoredVertices.GetValue(reinterpret_cast<ULong64_t>(vtx)));
        if (!cvertex) {
          if (mapStoredVertices.Capacity()<=mapStoredVertices.GetSize()) mapStoredVertices.Expand(2*mapStoredVertices.GetSize());
          if (fArrVertex.GetSize()<=fArrVertex.GetEntriesFast()) fArrVertex.Expand(2*fArrVertex.GetSize());
          cvertex = new (fArrVertex[fArrVertex.GetEntriesFast()]) AliAODVertex(*vtx);
          AssignID(cvertex);
          mapStoredVertices.Add(reinterpret_cast<ULong64_t>(vtx),reinterpret_cast<ULong64_t>(cvertex));
        }
      }
      ctrack->SetProdVertex(cvertex);
      ++tracks;
    }
  }
  fNTracksN=tracks;

  //TODO: pair arrays
}

//______________________________________________
void AliDielectronEvent::Clear(Option_t *opt)
{
  //
  // clear arrays
  //
//   fArrTrackP.Clear(opt);
//   fArrTrackN.Clear(opt);

  for (Int_t i=fArrTrackP.GetEntriesFast()-1; i>=0; --i){
    delete fArrTrackP.RemoveAt(i);
  }
  
  for (Int_t i=fArrTrackN.GetEntriesFast()-1; i>=0; --i){
    delete fArrTrackN.RemoveAt(i);
  }

  for (Int_t i=0; i<fArrVertex.GetEntriesFast(); ++i){
    delete fArrVertex.RemoveAt(i);
  }
  
  fArrTrackP.ExpandCreateFast(1);
  fArrTrackN.ExpandCreateFast(1);
  fArrVertex.ExpandCreateFast(1);

  fArrPairs.Clear(opt);
}

//______________________________________________
void AliDielectronEvent::SetAOD(Int_t size)
{
  //
  // use AOD as input
  //
  fArrTrackP.SetClass("AliAODTrack",size);
  fArrTrackN.SetClass("AliAODTrack",size);
  fIsAOD=kTRUE;
}

//______________________________________________
void AliDielectronEvent::SetESD()
{
  //
  // use ESD as input
  //
  fArrTrackP.SetClass("AliESDtrack",1000);
  fArrTrackN.SetClass("AliESDtrack",1000);
  fIsAOD=kFALSE;
}

//______________________________________________
void AliDielectronEvent::SetEventData(const Double_t data[AliDielectronVarManager::kNMaxValues])
{
  //
  // copy only evnet variables
  //
  for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues;++i) fEventData[i]=data[i];
}

//______________________________________________
void AliDielectronEvent::AssignID(TObject *obj)
{
  //
  // Custom function to assign a uid to an object with an own process id
  // to avoid problems buffering the vertices
  //
  UInt_t uid=1;
  if (fPID->GetObjects()) uid=fPID->GetObjects()->GetEntriesFast();
  uid+=(fPIDIndex<<24);
  obj->SetBit(kIsReferenced);
  obj->SetUniqueID(uid);
  fPID->PutObjectWithID(obj);
}
 AliDielectronEvent.cxx:1
 AliDielectronEvent.cxx:2
 AliDielectronEvent.cxx:3
 AliDielectronEvent.cxx:4
 AliDielectronEvent.cxx:5
 AliDielectronEvent.cxx:6
 AliDielectronEvent.cxx:7
 AliDielectronEvent.cxx:8
 AliDielectronEvent.cxx:9
 AliDielectronEvent.cxx:10
 AliDielectronEvent.cxx:11
 AliDielectronEvent.cxx:12
 AliDielectronEvent.cxx:13
 AliDielectronEvent.cxx:14
 AliDielectronEvent.cxx:15
 AliDielectronEvent.cxx:16
 AliDielectronEvent.cxx:17
 AliDielectronEvent.cxx:18
 AliDielectronEvent.cxx:19
 AliDielectronEvent.cxx:20
 AliDielectronEvent.cxx:21
 AliDielectronEvent.cxx:22
 AliDielectronEvent.cxx:23
 AliDielectronEvent.cxx:24
 AliDielectronEvent.cxx:25
 AliDielectronEvent.cxx:26
 AliDielectronEvent.cxx:27
 AliDielectronEvent.cxx:28
 AliDielectronEvent.cxx:29
 AliDielectronEvent.cxx:30
 AliDielectronEvent.cxx:31
 AliDielectronEvent.cxx:32
 AliDielectronEvent.cxx:33
 AliDielectronEvent.cxx:34
 AliDielectronEvent.cxx:35
 AliDielectronEvent.cxx:36
 AliDielectronEvent.cxx:37
 AliDielectronEvent.cxx:38
 AliDielectronEvent.cxx:39
 AliDielectronEvent.cxx:40
 AliDielectronEvent.cxx:41
 AliDielectronEvent.cxx:42
 AliDielectronEvent.cxx:43
 AliDielectronEvent.cxx:44
 AliDielectronEvent.cxx:45
 AliDielectronEvent.cxx:46
 AliDielectronEvent.cxx:47
 AliDielectronEvent.cxx:48
 AliDielectronEvent.cxx:49
 AliDielectronEvent.cxx:50
 AliDielectronEvent.cxx:51
 AliDielectronEvent.cxx:52
 AliDielectronEvent.cxx:53
 AliDielectronEvent.cxx:54
 AliDielectronEvent.cxx:55
 AliDielectronEvent.cxx:56
 AliDielectronEvent.cxx:57
 AliDielectronEvent.cxx:58
 AliDielectronEvent.cxx:59
 AliDielectronEvent.cxx:60
 AliDielectronEvent.cxx:61
 AliDielectronEvent.cxx:62
 AliDielectronEvent.cxx:63
 AliDielectronEvent.cxx:64
 AliDielectronEvent.cxx:65
 AliDielectronEvent.cxx:66
 AliDielectronEvent.cxx:67
 AliDielectronEvent.cxx:68
 AliDielectronEvent.cxx:69
 AliDielectronEvent.cxx:70
 AliDielectronEvent.cxx:71
 AliDielectronEvent.cxx:72
 AliDielectronEvent.cxx:73
 AliDielectronEvent.cxx:74
 AliDielectronEvent.cxx:75
 AliDielectronEvent.cxx:76
 AliDielectronEvent.cxx:77
 AliDielectronEvent.cxx:78
 AliDielectronEvent.cxx:79
 AliDielectronEvent.cxx:80
 AliDielectronEvent.cxx:81
 AliDielectronEvent.cxx:82
 AliDielectronEvent.cxx:83
 AliDielectronEvent.cxx:84
 AliDielectronEvent.cxx:85
 AliDielectronEvent.cxx:86
 AliDielectronEvent.cxx:87
 AliDielectronEvent.cxx:88
 AliDielectronEvent.cxx:89
 AliDielectronEvent.cxx:90
 AliDielectronEvent.cxx:91
 AliDielectronEvent.cxx:92
 AliDielectronEvent.cxx:93
 AliDielectronEvent.cxx:94
 AliDielectronEvent.cxx:95
 AliDielectronEvent.cxx:96
 AliDielectronEvent.cxx:97
 AliDielectronEvent.cxx:98
 AliDielectronEvent.cxx:99
 AliDielectronEvent.cxx:100
 AliDielectronEvent.cxx:101
 AliDielectronEvent.cxx:102
 AliDielectronEvent.cxx:103
 AliDielectronEvent.cxx:104
 AliDielectronEvent.cxx:105
 AliDielectronEvent.cxx:106
 AliDielectronEvent.cxx:107
 AliDielectronEvent.cxx:108
 AliDielectronEvent.cxx:109
 AliDielectronEvent.cxx:110
 AliDielectronEvent.cxx:111
 AliDielectronEvent.cxx:112
 AliDielectronEvent.cxx:113
 AliDielectronEvent.cxx:114
 AliDielectronEvent.cxx:115
 AliDielectronEvent.cxx:116
 AliDielectronEvent.cxx:117
 AliDielectronEvent.cxx:118
 AliDielectronEvent.cxx:119
 AliDielectronEvent.cxx:120
 AliDielectronEvent.cxx:121
 AliDielectronEvent.cxx:122
 AliDielectronEvent.cxx:123
 AliDielectronEvent.cxx:124
 AliDielectronEvent.cxx:125
 AliDielectronEvent.cxx:126
 AliDielectronEvent.cxx:127
 AliDielectronEvent.cxx:128
 AliDielectronEvent.cxx:129
 AliDielectronEvent.cxx:130
 AliDielectronEvent.cxx:131
 AliDielectronEvent.cxx:132
 AliDielectronEvent.cxx:133
 AliDielectronEvent.cxx:134
 AliDielectronEvent.cxx:135
 AliDielectronEvent.cxx:136
 AliDielectronEvent.cxx:137
 AliDielectronEvent.cxx:138
 AliDielectronEvent.cxx:139
 AliDielectronEvent.cxx:140
 AliDielectronEvent.cxx:141
 AliDielectronEvent.cxx:142
 AliDielectronEvent.cxx:143
 AliDielectronEvent.cxx:144
 AliDielectronEvent.cxx:145
 AliDielectronEvent.cxx:146
 AliDielectronEvent.cxx:147
 AliDielectronEvent.cxx:148
 AliDielectronEvent.cxx:149
 AliDielectronEvent.cxx:150
 AliDielectronEvent.cxx:151
 AliDielectronEvent.cxx:152
 AliDielectronEvent.cxx:153
 AliDielectronEvent.cxx:154
 AliDielectronEvent.cxx:155
 AliDielectronEvent.cxx:156
 AliDielectronEvent.cxx:157
 AliDielectronEvent.cxx:158
 AliDielectronEvent.cxx:159
 AliDielectronEvent.cxx:160
 AliDielectronEvent.cxx:161
 AliDielectronEvent.cxx:162
 AliDielectronEvent.cxx:163
 AliDielectronEvent.cxx:164
 AliDielectronEvent.cxx:165
 AliDielectronEvent.cxx:166
 AliDielectronEvent.cxx:167
 AliDielectronEvent.cxx:168
 AliDielectronEvent.cxx:169
 AliDielectronEvent.cxx:170
 AliDielectronEvent.cxx:171
 AliDielectronEvent.cxx:172
 AliDielectronEvent.cxx:173
 AliDielectronEvent.cxx:174
 AliDielectronEvent.cxx:175
 AliDielectronEvent.cxx:176
 AliDielectronEvent.cxx:177
 AliDielectronEvent.cxx:178
 AliDielectronEvent.cxx:179
 AliDielectronEvent.cxx:180
 AliDielectronEvent.cxx:181
 AliDielectronEvent.cxx:182
 AliDielectronEvent.cxx:183
 AliDielectronEvent.cxx:184
 AliDielectronEvent.cxx:185
 AliDielectronEvent.cxx:186
 AliDielectronEvent.cxx:187
 AliDielectronEvent.cxx:188
 AliDielectronEvent.cxx:189
 AliDielectronEvent.cxx:190
 AliDielectronEvent.cxx:191
 AliDielectronEvent.cxx:192
 AliDielectronEvent.cxx:193
 AliDielectronEvent.cxx:194
 AliDielectronEvent.cxx:195
 AliDielectronEvent.cxx:196
 AliDielectronEvent.cxx:197
 AliDielectronEvent.cxx:198
 AliDielectronEvent.cxx:199
 AliDielectronEvent.cxx:200
 AliDielectronEvent.cxx:201
 AliDielectronEvent.cxx:202
 AliDielectronEvent.cxx:203
 AliDielectronEvent.cxx:204
 AliDielectronEvent.cxx:205
 AliDielectronEvent.cxx:206
 AliDielectronEvent.cxx:207
 AliDielectronEvent.cxx:208
 AliDielectronEvent.cxx:209
 AliDielectronEvent.cxx:210
 AliDielectronEvent.cxx:211
 AliDielectronEvent.cxx:212
 AliDielectronEvent.cxx:213
 AliDielectronEvent.cxx:214
 AliDielectronEvent.cxx:215
 AliDielectronEvent.cxx:216
 AliDielectronEvent.cxx:217
 AliDielectronEvent.cxx:218
 AliDielectronEvent.cxx:219
 AliDielectronEvent.cxx:220
 AliDielectronEvent.cxx:221
 AliDielectronEvent.cxx:222
 AliDielectronEvent.cxx:223
 AliDielectronEvent.cxx:224
 AliDielectronEvent.cxx:225
 AliDielectronEvent.cxx:226
 AliDielectronEvent.cxx:227
 AliDielectronEvent.cxx:228
 AliDielectronEvent.cxx:229
 AliDielectronEvent.cxx:230
 AliDielectronEvent.cxx:231
 AliDielectronEvent.cxx:232
 AliDielectronEvent.cxx:233
 AliDielectronEvent.cxx:234
 AliDielectronEvent.cxx:235
 AliDielectronEvent.cxx:236
 AliDielectronEvent.cxx:237
 AliDielectronEvent.cxx:238
 AliDielectronEvent.cxx:239
 AliDielectronEvent.cxx:240
 AliDielectronEvent.cxx:241
 AliDielectronEvent.cxx:242
 AliDielectronEvent.cxx:243
 AliDielectronEvent.cxx:244
 AliDielectronEvent.cxx:245
 AliDielectronEvent.cxx:246
 AliDielectronEvent.cxx:247
 AliDielectronEvent.cxx:248
 AliDielectronEvent.cxx:249
 AliDielectronEvent.cxx:250
 AliDielectronEvent.cxx:251
 AliDielectronEvent.cxx:252
 AliDielectronEvent.cxx:253
 AliDielectronEvent.cxx:254
 AliDielectronEvent.cxx:255
 AliDielectronEvent.cxx:256
 AliDielectronEvent.cxx:257
 AliDielectronEvent.cxx:258