ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#include "AliEveJetPlane.h"

#include <TEveTrans.h>
#include <TEveArrow.h>
#include <TEveSelection.h>
#include <TEveManager.h>

#include <TBuffer3D.h>
#include <TBuffer3DTypes.h>
#include <TVirtualPad.h>
#include <TVirtualViewer3D.h>

#include <TColor.h>
#include <TStyle.h>
#include <TROOT.h>

//______________________________________________________________________________
//
// Show jets and tracks in eta-phi plane.
//
//

ClassImp(AliEveJetPlane)

Bool_t AliEveJetPlane::fgOneMomentumXYZ      = kFALSE;
Bool_t AliEveJetPlane::fgOneMomentumPhiTheta = kFALSE;
Bool_t AliEveJetPlane::fgOneEta              = kFALSE;
Bool_t AliEveJetPlane::fgOneE                = kFALSE;
Bool_t AliEveJetPlane::fgOneChgMass          = kFALSE;


AliEveJetPlane::AliEveJetPlane(Int_t iev) :
  TEveElementList(Form("AliEveJetPlane %i",iev), Form("%i",iev)),

  fMinEta (-1.5 ),
  fMaxEta ( 1.5 ),
  fMinPhi ( 0.0 ),
  fMaxPhi ( 2.0 * TMath::Pi() ),

  fNEtaDiv(30),
  fNPhiDiv(30),

  fEtaScale(350/1.5),
  fPhiScale(350/(TMath::Pi())),
  fEnergyScale(50.0),

  fArrowJetScale (2.0),
	fArrowTrackScale (0.7),

  fGridColor(5),

  fJets(),
  fTracks(),

  fRnrJets (kTRUE),
  fRnrTracks (kTRUE),

  fOneSelection (kTRUE),
  fTwoSelection (kFALSE),
  fSelConnected (kFALSE),

  fJet1(0), fJet2(0), fTrack1(0), fTrack2(0),

  fSelectionFlag (1)
{
  // Constructor.

  SetMainColorPtr(&fGridColor);
  InitMainTrans();
}

AliEveJetPlane::~AliEveJetPlane()
{
  // Destructor.

  if (fSelConnected)
  {
    gEve->GetSelection()->Disconnect("SelectionAdded(TEveElement*)", this);
  }
}

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

void AliEveJetPlane::AddJet(AliAODJet* jet)
{
  // Add a jet for display.

  fJets.push_back(*jet);
}

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

void AliEveJetPlane::AddTrack(AliAODTrack* track)
{
  // Add a track for display.

  fTracks.push_back(*track);
}

void AliEveJetPlane::CreateArrows()
{
  // Create arrows according to current state.

  TEveManager::TRedrawDisabler noRedraw(gEve);

  DestroyElements();

  // Finding the maximum energy
  Double_t eJetMax = 0., eTrackMax = 0., eMax;
  {
    std::vector<AliAODTrack>::iterator k = fTracks.begin();
    std::vector<AliAODJet>::iterator   j = fJets.begin();

    while (j != fJets.end())
    {
      if (j->E() > eJetMax) eJetMax = j->E();
      ++j;
    }

    while (k != fTracks.end())
    {
      if (k->E() > eTrackMax) eTrackMax = k->E();
      ++k;
    }

    eMax = eJetMax > eTrackMax ? eJetMax : eTrackMax;
  }

  // Colors
  Int_t    nCol = gStyle->GetNumberOfColors();

  Double_t eta, phi, e, x, y, h;

  if (fRnrJets)
  {
    UInt_t jetid = 0;
    std::vector<AliAODJet>::iterator j = fJets.begin();
    while (j != fJets.end())
    {
      eta = j->Eta();
      phi = j->Phi();
      e   = j->E();
      h   = TMath::Log(e + 1.) * fEnergyScale;

      x = eta*(fEtaScale);
      y = phi*(fPhiScale) - 350;

      Int_t colBin = TMath::Min((Int_t) ((nCol-2)*TMath::Log(e + 1.)/(TMath::Log(eMax + 1.))),nCol-2);
      Int_t colIdx = gStyle->GetColorPalette(colBin);

      TEveArrow *a = new TEveArrow(0, 0 , h, x, y, 0);
      a->SetSourceObject(&*j);
      a->SetElementName (Form("Jet %d", jetid));
      a->SetElementTitle(Form("Jet 4-momentum: %f, %f, %f, %f \n Pt-Eta-Phi values: %f, %f, %f",
                              j->Px(), j->Py(), j->Pz(), e, j->Pt(), eta, phi ));
      a->SetPickable(kTRUE);
      a->SetMainColor(colIdx);
      a->SetTubeR(0.016*fArrowJetScale);
      a->SetConeR(0.049*fArrowJetScale);
      a->SetConeL(0.170*fArrowJetScale);
      AddElement(a);

      ++j; ++jetid;
    }
  }

  if (fRnrTracks)
  {
    UInt_t trackid = 0;
    std::vector<AliAODTrack>::iterator k = fTracks.begin();
    while (k != fTracks.end())
    {
      eta = k->Eta();
      phi = k->Phi();
      e   = k->E();
      h   = TMath::Log(e + 1.) * fEnergyScale;

      if (e < 0)
      {
        Warning("CreateArrows()",
                "Track %d has negative energy - NOT DISPLAYED.", trackid);
	++k; ++trackid;
	continue;
      }

      x = eta*(fEtaScale);
      y = phi*(fPhiScale) - 350;

      Int_t colBin = TMath::Min((Int_t) ((nCol-2)*TMath::Log(e + 1.)/(TMath::Log(eMax + 1.))),nCol-2);
      Int_t colIdx = gStyle->GetColorPalette(colBin);

      TEveArrow *a = new TEveArrow(0, 0 , h, x, y, 0);
      a->SetSourceObject(&*k);
      a->SetElementName (Form("Track %d", trackid));
      a->SetElementTitle(Form("Track 4-momentum: %f, %f, %f, %f \n Pt-Eta-Phi values: %f, %f, %f",
                              k->Px(), k->Py(), k->Pz(), e, k->Pt(), eta, phi ));
      a->SetPickable(kTRUE);
      a->SetMainColor(colIdx);
      a->SetTubeR(0.015*fArrowTrackScale);
      a->SetConeR(0.040*fArrowTrackScale);
      a->SetConeL(0.130*fArrowTrackScale);
      AddElement(a);

      ++k; ++trackid;
    }
  }

  if ( ! fSelConnected)
  {
    gEve->GetSelection()->Connect("SelectionAdded(TEveElement*)",
       "AliEveJetPlane", this, "SelectionAdded(TEveElement*)");
    fSelConnected = kTRUE;
  }
}

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

void AliEveJetPlane::SelectionAdded(TEveElement* el)
{
  // Slot called when EVE selection gets a new element.


  if (fOneSelection)
  {
    if (HasChild(el))
    {
      printf("\n\nNOW SELECTED: %s\n", el->GetElementName());

      TObject *src = el->GetSourceObject();

      AliAODTrack *k = dynamic_cast<AliAODTrack*>(src);
      AliAODJet   *j = dynamic_cast<AliAODJet*>  (src);

      //		printf ("Track %p --- Jet %p\n", (void*)t, (void*)j);
      if (k) printf("Track 4-momentum: %f, %f, %f, %f \nPt-Eta-Phi values: %f, %f, %f \n",
                    k->Px(), k->Py(), k->Pz(), k->E(), k->Pt(), k->Eta(), k->Phi() );

      if (j) printf("Jet 4-momentum: %f, %f, %f, %f \nPt-Eta-Phi values: %f, %f, %f \n",
                    j->Px(), j->Py(), j->Pz(), j->E(), j->Pt(), j->Eta(), j->Phi() );
    }
  }

  TEveSelection *sel = gEve->GetSelection();
  if (fTwoSelection && sel->NumChildren() == 2)
  {
    Int_t          numvps   = 0;
    AliVParticle  *vpart[2] = { 0 };
    TEveElement   *elmnt[2] = { 0 };

    for (List_i i = sel->BeginChildren(); i != sel->EndChildren(); ++i)
    {
      if (HasChild(*i))
      {
        TEveElement  *chld = *i;
        TObject      *src  = chld->GetSourceObject();
	AliVParticle *p    = dynamic_cast<AliVParticle*>(src);

        if (p != 0)
        {
          vpart[numvps] = p;
          elmnt[numvps] = chld;
          ++numvps;
          if (numvps >= 2)
            break;
        }
      }
    }

    Double_t eta0, eta1, phi0, phi1, d;

    if (numvps == 2)
    {
      eta0 = vpart[0]->Eta();
      eta1 = vpart[1]->Eta();
      phi0 = vpart[0]->Phi();
      phi1 = vpart[1]->Phi();

      d = TMath::Sqrt(TMath::Power(eta1-eta0,2) + TMath::Power(phi1-phi0,2));
      printf("\n\nNOW SELECTED: '%s' and '%s'\n",
             elmnt[0]->GetElementName(), elmnt[1]->GetElementName());
      printf("Eta-Phi Distance: %f\n", d);
    }
  }
}

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

void AliEveJetPlane::ComputeBBox()
{
  // Calculate bounding-box.

  BBoxInit();
  BBoxCheckPoint(-350, -350, -20);
  BBoxCheckPoint( 350, 350,  20);
}


void AliEveJetPlane::Paint(Option_t* /*option*/)
{
  // Paint the object.

  TBuffer3D buff(TBuffer3DTypes::kGeneric);

  // Section kCore
  buff.fID           = this;
  buff.fColor        = GetMainColor();
  buff.fTransparency = GetMainTransparency();
  if (HasMainTrans()) RefMainTrans().SetBuffer3D(buff);
  buff.SetSectionsValid(TBuffer3D::kCore);

  Int_t reqSections = gPad->GetViewer3D()->AddObject(buff);
  if (reqSections == TBuffer3D::kNone) {
    // printf("AliEveJetPlane::Paint viewer was happy with Core buff3d.\n");
    return;
  }
}
 AliEveJetPlane.cxx:1
 AliEveJetPlane.cxx:2
 AliEveJetPlane.cxx:3
 AliEveJetPlane.cxx:4
 AliEveJetPlane.cxx:5
 AliEveJetPlane.cxx:6
 AliEveJetPlane.cxx:7
 AliEveJetPlane.cxx:8
 AliEveJetPlane.cxx:9
 AliEveJetPlane.cxx:10
 AliEveJetPlane.cxx:11
 AliEveJetPlane.cxx:12
 AliEveJetPlane.cxx:13
 AliEveJetPlane.cxx:14
 AliEveJetPlane.cxx:15
 AliEveJetPlane.cxx:16
 AliEveJetPlane.cxx:17
 AliEveJetPlane.cxx:18
 AliEveJetPlane.cxx:19
 AliEveJetPlane.cxx:20
 AliEveJetPlane.cxx:21
 AliEveJetPlane.cxx:22
 AliEveJetPlane.cxx:23
 AliEveJetPlane.cxx:24
 AliEveJetPlane.cxx:25
 AliEveJetPlane.cxx:26
 AliEveJetPlane.cxx:27
 AliEveJetPlane.cxx:28
 AliEveJetPlane.cxx:29
 AliEveJetPlane.cxx:30
 AliEveJetPlane.cxx:31
 AliEveJetPlane.cxx:32
 AliEveJetPlane.cxx:33
 AliEveJetPlane.cxx:34
 AliEveJetPlane.cxx:35
 AliEveJetPlane.cxx:36
 AliEveJetPlane.cxx:37
 AliEveJetPlane.cxx:38
 AliEveJetPlane.cxx:39
 AliEveJetPlane.cxx:40
 AliEveJetPlane.cxx:41
 AliEveJetPlane.cxx:42
 AliEveJetPlane.cxx:43
 AliEveJetPlane.cxx:44
 AliEveJetPlane.cxx:45
 AliEveJetPlane.cxx:46
 AliEveJetPlane.cxx:47
 AliEveJetPlane.cxx:48
 AliEveJetPlane.cxx:49
 AliEveJetPlane.cxx:50
 AliEveJetPlane.cxx:51
 AliEveJetPlane.cxx:52
 AliEveJetPlane.cxx:53
 AliEveJetPlane.cxx:54
 AliEveJetPlane.cxx:55
 AliEveJetPlane.cxx:56
 AliEveJetPlane.cxx:57
 AliEveJetPlane.cxx:58
 AliEveJetPlane.cxx:59
 AliEveJetPlane.cxx:60
 AliEveJetPlane.cxx:61
 AliEveJetPlane.cxx:62
 AliEveJetPlane.cxx:63
 AliEveJetPlane.cxx:64
 AliEveJetPlane.cxx:65
 AliEveJetPlane.cxx:66
 AliEveJetPlane.cxx:67
 AliEveJetPlane.cxx:68
 AliEveJetPlane.cxx:69
 AliEveJetPlane.cxx:70
 AliEveJetPlane.cxx:71
 AliEveJetPlane.cxx:72
 AliEveJetPlane.cxx:73
 AliEveJetPlane.cxx:74
 AliEveJetPlane.cxx:75
 AliEveJetPlane.cxx:76
 AliEveJetPlane.cxx:77
 AliEveJetPlane.cxx:78
 AliEveJetPlane.cxx:79
 AliEveJetPlane.cxx:80
 AliEveJetPlane.cxx:81
 AliEveJetPlane.cxx:82
 AliEveJetPlane.cxx:83
 AliEveJetPlane.cxx:84
 AliEveJetPlane.cxx:85
 AliEveJetPlane.cxx:86
 AliEveJetPlane.cxx:87
 AliEveJetPlane.cxx:88
 AliEveJetPlane.cxx:89
 AliEveJetPlane.cxx:90
 AliEveJetPlane.cxx:91
 AliEveJetPlane.cxx:92
 AliEveJetPlane.cxx:93
 AliEveJetPlane.cxx:94
 AliEveJetPlane.cxx:95
 AliEveJetPlane.cxx:96
 AliEveJetPlane.cxx:97
 AliEveJetPlane.cxx:98
 AliEveJetPlane.cxx:99
 AliEveJetPlane.cxx:100
 AliEveJetPlane.cxx:101
 AliEveJetPlane.cxx:102
 AliEveJetPlane.cxx:103
 AliEveJetPlane.cxx:104
 AliEveJetPlane.cxx:105
 AliEveJetPlane.cxx:106
 AliEveJetPlane.cxx:107
 AliEveJetPlane.cxx:108
 AliEveJetPlane.cxx:109
 AliEveJetPlane.cxx:110
 AliEveJetPlane.cxx:111
 AliEveJetPlane.cxx:112
 AliEveJetPlane.cxx:113
 AliEveJetPlane.cxx:114
 AliEveJetPlane.cxx:115
 AliEveJetPlane.cxx:116
 AliEveJetPlane.cxx:117
 AliEveJetPlane.cxx:118
 AliEveJetPlane.cxx:119
 AliEveJetPlane.cxx:120
 AliEveJetPlane.cxx:121
 AliEveJetPlane.cxx:122
 AliEveJetPlane.cxx:123
 AliEveJetPlane.cxx:124
 AliEveJetPlane.cxx:125
 AliEveJetPlane.cxx:126
 AliEveJetPlane.cxx:127
 AliEveJetPlane.cxx:128
 AliEveJetPlane.cxx:129
 AliEveJetPlane.cxx:130
 AliEveJetPlane.cxx:131
 AliEveJetPlane.cxx:132
 AliEveJetPlane.cxx:133
 AliEveJetPlane.cxx:134
 AliEveJetPlane.cxx:135
 AliEveJetPlane.cxx:136
 AliEveJetPlane.cxx:137
 AliEveJetPlane.cxx:138
 AliEveJetPlane.cxx:139
 AliEveJetPlane.cxx:140
 AliEveJetPlane.cxx:141
 AliEveJetPlane.cxx:142
 AliEveJetPlane.cxx:143
 AliEveJetPlane.cxx:144
 AliEveJetPlane.cxx:145
 AliEveJetPlane.cxx:146
 AliEveJetPlane.cxx:147
 AliEveJetPlane.cxx:148
 AliEveJetPlane.cxx:149
 AliEveJetPlane.cxx:150
 AliEveJetPlane.cxx:151
 AliEveJetPlane.cxx:152
 AliEveJetPlane.cxx:153
 AliEveJetPlane.cxx:154
 AliEveJetPlane.cxx:155
 AliEveJetPlane.cxx:156
 AliEveJetPlane.cxx:157
 AliEveJetPlane.cxx:158
 AliEveJetPlane.cxx:159
 AliEveJetPlane.cxx:160
 AliEveJetPlane.cxx:161
 AliEveJetPlane.cxx:162
 AliEveJetPlane.cxx:163
 AliEveJetPlane.cxx:164
 AliEveJetPlane.cxx:165
 AliEveJetPlane.cxx:166
 AliEveJetPlane.cxx:167
 AliEveJetPlane.cxx:168
 AliEveJetPlane.cxx:169
 AliEveJetPlane.cxx:170
 AliEveJetPlane.cxx:171
 AliEveJetPlane.cxx:172
 AliEveJetPlane.cxx:173
 AliEveJetPlane.cxx:174
 AliEveJetPlane.cxx:175
 AliEveJetPlane.cxx:176
 AliEveJetPlane.cxx:177
 AliEveJetPlane.cxx:178
 AliEveJetPlane.cxx:179
 AliEveJetPlane.cxx:180
 AliEveJetPlane.cxx:181
 AliEveJetPlane.cxx:182
 AliEveJetPlane.cxx:183
 AliEveJetPlane.cxx:184
 AliEveJetPlane.cxx:185
 AliEveJetPlane.cxx:186
 AliEveJetPlane.cxx:187
 AliEveJetPlane.cxx:188
 AliEveJetPlane.cxx:189
 AliEveJetPlane.cxx:190
 AliEveJetPlane.cxx:191
 AliEveJetPlane.cxx:192
 AliEveJetPlane.cxx:193
 AliEveJetPlane.cxx:194
 AliEveJetPlane.cxx:195
 AliEveJetPlane.cxx:196
 AliEveJetPlane.cxx:197
 AliEveJetPlane.cxx:198
 AliEveJetPlane.cxx:199
 AliEveJetPlane.cxx:200
 AliEveJetPlane.cxx:201
 AliEveJetPlane.cxx:202
 AliEveJetPlane.cxx:203
 AliEveJetPlane.cxx:204
 AliEveJetPlane.cxx:205
 AliEveJetPlane.cxx:206
 AliEveJetPlane.cxx:207
 AliEveJetPlane.cxx:208
 AliEveJetPlane.cxx:209
 AliEveJetPlane.cxx:210
 AliEveJetPlane.cxx:211
 AliEveJetPlane.cxx:212
 AliEveJetPlane.cxx:213
 AliEveJetPlane.cxx:214
 AliEveJetPlane.cxx:215
 AliEveJetPlane.cxx:216
 AliEveJetPlane.cxx:217
 AliEveJetPlane.cxx:218
 AliEveJetPlane.cxx:219
 AliEveJetPlane.cxx:220
 AliEveJetPlane.cxx:221
 AliEveJetPlane.cxx:222
 AliEveJetPlane.cxx:223
 AliEveJetPlane.cxx:224
 AliEveJetPlane.cxx:225
 AliEveJetPlane.cxx:226
 AliEveJetPlane.cxx:227
 AliEveJetPlane.cxx:228
 AliEveJetPlane.cxx:229
 AliEveJetPlane.cxx:230
 AliEveJetPlane.cxx:231
 AliEveJetPlane.cxx:232
 AliEveJetPlane.cxx:233
 AliEveJetPlane.cxx:234
 AliEveJetPlane.cxx:235
 AliEveJetPlane.cxx:236
 AliEveJetPlane.cxx:237
 AliEveJetPlane.cxx:238
 AliEveJetPlane.cxx:239
 AliEveJetPlane.cxx:240
 AliEveJetPlane.cxx:241
 AliEveJetPlane.cxx:242
 AliEveJetPlane.cxx:243
 AliEveJetPlane.cxx:244
 AliEveJetPlane.cxx:245
 AliEveJetPlane.cxx:246
 AliEveJetPlane.cxx:247
 AliEveJetPlane.cxx:248
 AliEveJetPlane.cxx:249
 AliEveJetPlane.cxx:250
 AliEveJetPlane.cxx:251
 AliEveJetPlane.cxx:252
 AliEveJetPlane.cxx:253
 AliEveJetPlane.cxx:254
 AliEveJetPlane.cxx:255
 AliEveJetPlane.cxx:256
 AliEveJetPlane.cxx:257
 AliEveJetPlane.cxx:258
 AliEveJetPlane.cxx:259
 AliEveJetPlane.cxx:260
 AliEveJetPlane.cxx:261
 AliEveJetPlane.cxx:262
 AliEveJetPlane.cxx:263
 AliEveJetPlane.cxx:264
 AliEveJetPlane.cxx:265
 AliEveJetPlane.cxx:266
 AliEveJetPlane.cxx:267
 AliEveJetPlane.cxx:268
 AliEveJetPlane.cxx:269
 AliEveJetPlane.cxx:270
 AliEveJetPlane.cxx:271
 AliEveJetPlane.cxx:272
 AliEveJetPlane.cxx:273
 AliEveJetPlane.cxx:274
 AliEveJetPlane.cxx:275
 AliEveJetPlane.cxx:276
 AliEveJetPlane.cxx:277
 AliEveJetPlane.cxx:278
 AliEveJetPlane.cxx:279
 AliEveJetPlane.cxx:280
 AliEveJetPlane.cxx:281
 AliEveJetPlane.cxx:282
 AliEveJetPlane.cxx:283
 AliEveJetPlane.cxx:284
 AliEveJetPlane.cxx:285
 AliEveJetPlane.cxx:286
 AliEveJetPlane.cxx:287
 AliEveJetPlane.cxx:288
 AliEveJetPlane.cxx:289
 AliEveJetPlane.cxx:290
 AliEveJetPlane.cxx:291
 AliEveJetPlane.cxx:292
 AliEveJetPlane.cxx:293
 AliEveJetPlane.cxx:294
 AliEveJetPlane.cxx:295
 AliEveJetPlane.cxx:296
 AliEveJetPlane.cxx:297
 AliEveJetPlane.cxx:298
 AliEveJetPlane.cxx:299
 AliEveJetPlane.cxx:300
 AliEveJetPlane.cxx:301
 AliEveJetPlane.cxx:302
 AliEveJetPlane.cxx:303
 AliEveJetPlane.cxx:304
 AliEveJetPlane.cxx:305
 AliEveJetPlane.cxx:306
 AliEveJetPlane.cxx:307
 AliEveJetPlane.cxx:308
 AliEveJetPlane.cxx:309
 AliEveJetPlane.cxx:310
 AliEveJetPlane.cxx:311
 AliEveJetPlane.cxx:312
 AliEveJetPlane.cxx:313
 AliEveJetPlane.cxx:314
 AliEveJetPlane.cxx:315
 AliEveJetPlane.cxx:316
 AliEveJetPlane.cxx:317
 AliEveJetPlane.cxx:318
 AliEveJetPlane.cxx:319
 AliEveJetPlane.cxx:320
 AliEveJetPlane.cxx:321
 AliEveJetPlane.cxx:322
 AliEveJetPlane.cxx:323
 AliEveJetPlane.cxx:324
 AliEveJetPlane.cxx:325