ROOT logo
// $Id$

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

/// \ingroup evemacros
/// \file muon_digits.C
/// \brief  Macro to visualise digits from MUON spectrometer 
/// (both tracker and trigger).
///
/// Use muon_digits() in order to run it
///
/// Needs that alieve_init() is already called
///
/// \author P. Pillot, L. Aphecetche; Subatech

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <Riostream.h>
#include <TTree.h>
#include <TStyle.h>
#include <TEveManager.h>
#include <TEveQuadSet.h>

#include <AliLog.h>
#include <AliMUONGeometryTransformer.h>
#include <AliMUONVDigit.h>
#include <AliMUONVDigitStore.h>
#include <AliMpPad.h>
#include <AliMpSegmentation.h>
#include <AliMpVSegmentation.h>
#include <AliMpCDB.h>
#include <AliRunLoader.h>
#include <AliEveEventManager.h>
#endif

//______________________________________________________________________________
void add_muon_digits(TIter* next, TEveQuadSet* bending, TEveQuadSet* nonBending, Bool_t fromRaw)
{
  // load mapping
  AliMpCDB::LoadAll(kFALSE);
  
  // load geometry
  static AliMUONGeometryTransformer* gMUONGeometryTransformer = 0x0;
  if (!gMUONGeometryTransformer) 
  {
    AliEveEventManager::AssertGeometry();
    gMUONGeometryTransformer = new AliMUONGeometryTransformer();
    gMUONGeometryTransformer->LoadGeometryData();
  }
  
  // loop over digits and produce corresponding graphic objects
  AliMUONVDigit* digit;
  while ( ( digit = static_cast<AliMUONVDigit*>((*next)() ) ) )
  {
    if (!digit->IsTrigger() && !fromRaw && digit->Charge() < 1.e-3) continue;
    
    Int_t detElemId = digit->DetElemId();
    Int_t manuId = digit->ManuId();
    
    const AliMpVSegmentation* vseg =
      AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(digit->Cathode()));
    if (!vseg) 
    {
      AliInfoGeneral("muon_digits.C", Form("Could not get segmentation for DE %4d MANU %4d",detElemId,manuId));
      continue; // should not happen, unless we got a readout error and thus a bad de,manu pair
    }
    
    AliMpPad pad = vseg->PadByLocation(manuId,digit->ManuChannel());
    
    Double_t local[] = { pad.GetPositionX(), pad.GetPositionY(), 0.0 };
    Double_t global[] = { 0.0, 0.0, 0.0 };
    
    gMUONGeometryTransformer->Local2Global(detElemId,
                                           local[0], local[1], local[2],
                                           global[0], global[1], global[2]);
    
    TEveQuadSet* pads = bending;
    if (vseg->PlaneType()==AliMp::kNonBendingPlane) pads = nonBending;
    
    pads->AddQuad(global[0]-pad.GetDimensionX(),global[1]-pad.GetDimensionY(),global[2],
		  2.*pad.GetDimensionX(),2.*pad.GetDimensionY());
    
    if (fromRaw && !digit->IsTrigger()) pads->QuadValue(digit->ADC());
    else pads->QuadValue((Int_t) digit->Charge());
  }
  
}

//______________________________________________________________________________
void muon_digits()
{
  // load digits
  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
  rl->LoadDigits("MUON");
  TTree* dt = rl->GetTreeD("MUON", kFALSE);
  if (!dt) return;
  AliMUONVDigitStore *digitStore = AliMUONVDigitStore::Create(*dt);
  digitStore->Clear();
  digitStore->Connect(*dt,0);
  dt->GetEvent(0);
  rl->UnloadDigits("MUON");
  
  if (digitStore->GetSize() == 0 && !gEve->GetKeepEmptyCont()) {
    delete digitStore;
    return;
  }
  
  // container for graphic representation of digits
  TEveElementList* cont = new TEveElementList("MUON Digits");
  
  TEveQuadSet* bending = new TEveQuadSet(TEveQuadSet::kQT_RectangleXY, kFALSE, 32);
  bending->SetName("Bending");
  bending->SetRenderMode(TEveDigitSet::kRM_Fill);
  bending->SetPickable(kFALSE);
  cont->AddElement(bending);
  
  TEveQuadSet* nonBending = new TEveQuadSet(TEveQuadSet::kQT_RectangleXY, kFALSE, 32);
  nonBending->SetName("Non bending");
  nonBending->SetRenderMode(TEveDigitSet::kRM_Line);
  nonBending->SetPickable(kFALSE);
  cont->AddElement(nonBending);
  
  // add digits to the containers
  TIter next(digitStore->CreateIterator());
  add_muon_digits(&next, bending, nonBending, kFALSE);
  delete digitStore;
  
  // set containers' title
  Int_t nDigitB = bending->GetPlex()->Size();
  Int_t nDigitNB = nonBending->GetPlex()->Size();
  cont->SetTitle(Form("N=%d",nDigitB+nDigitNB));
  bending->SetTitle(Form("N=%d",nDigitB));
  nonBending->SetTitle(Form("N=%d",nDigitNB));
  
  // automatic scaling
  gStyle->SetPalette(1);
  bending->AssertPalette();
  nonBending->AssertPalette();
  
  // add graphic containers
  gEve->DisableRedraw();
  gEve->AddElement(cont);
  gEve->EnableRedraw();
  gEve->Redraw3D();
}
 muon_digits.C:1
 muon_digits.C:2
 muon_digits.C:3
 muon_digits.C:4
 muon_digits.C:5
 muon_digits.C:6
 muon_digits.C:7
 muon_digits.C:8
 muon_digits.C:9
 muon_digits.C:10
 muon_digits.C:11
 muon_digits.C:12
 muon_digits.C:13
 muon_digits.C:14
 muon_digits.C:15
 muon_digits.C:16
 muon_digits.C:17
 muon_digits.C:18
 muon_digits.C:19
 muon_digits.C:20
 muon_digits.C:21
 muon_digits.C:22
 muon_digits.C:23
 muon_digits.C:24
 muon_digits.C:25
 muon_digits.C:26
 muon_digits.C:27
 muon_digits.C:28
 muon_digits.C:29
 muon_digits.C:30
 muon_digits.C:31
 muon_digits.C:32
 muon_digits.C:33
 muon_digits.C:34
 muon_digits.C:35
 muon_digits.C:36
 muon_digits.C:37
 muon_digits.C:38
 muon_digits.C:39
 muon_digits.C:40
 muon_digits.C:41
 muon_digits.C:42
 muon_digits.C:43
 muon_digits.C:44
 muon_digits.C:45
 muon_digits.C:46
 muon_digits.C:47
 muon_digits.C:48
 muon_digits.C:49
 muon_digits.C:50
 muon_digits.C:51
 muon_digits.C:52
 muon_digits.C:53
 muon_digits.C:54
 muon_digits.C:55
 muon_digits.C:56
 muon_digits.C:57
 muon_digits.C:58
 muon_digits.C:59
 muon_digits.C:60
 muon_digits.C:61
 muon_digits.C:62
 muon_digits.C:63
 muon_digits.C:64
 muon_digits.C:65
 muon_digits.C:66
 muon_digits.C:67
 muon_digits.C:68
 muon_digits.C:69
 muon_digits.C:70
 muon_digits.C:71
 muon_digits.C:72
 muon_digits.C:73
 muon_digits.C:74
 muon_digits.C:75
 muon_digits.C:76
 muon_digits.C:77
 muon_digits.C:78
 muon_digits.C:79
 muon_digits.C:80
 muon_digits.C:81
 muon_digits.C:82
 muon_digits.C:83
 muon_digits.C:84
 muon_digits.C:85
 muon_digits.C:86
 muon_digits.C:87
 muon_digits.C:88
 muon_digits.C:89
 muon_digits.C:90
 muon_digits.C:91
 muon_digits.C:92
 muon_digits.C:93
 muon_digits.C:94
 muon_digits.C:95
 muon_digits.C:96
 muon_digits.C:97
 muon_digits.C:98
 muon_digits.C:99
 muon_digits.C:100
 muon_digits.C:101
 muon_digits.C:102
 muon_digits.C:103
 muon_digits.C:104
 muon_digits.C:105
 muon_digits.C:106
 muon_digits.C:107
 muon_digits.C:108
 muon_digits.C:109
 muon_digits.C:110
 muon_digits.C:111
 muon_digits.C:112
 muon_digits.C:113
 muon_digits.C:114
 muon_digits.C:115
 muon_digits.C:116
 muon_digits.C:117
 muon_digits.C:118
 muon_digits.C:119
 muon_digits.C:120
 muon_digits.C:121
 muon_digits.C:122
 muon_digits.C:123
 muon_digits.C:124
 muon_digits.C:125
 muon_digits.C:126
 muon_digits.C:127
 muon_digits.C:128
 muon_digits.C:129
 muon_digits.C:130
 muon_digits.C:131
 muon_digits.C:132
 muon_digits.C:133
 muon_digits.C:134
 muon_digits.C:135
 muon_digits.C:136
 muon_digits.C:137
 muon_digits.C:138
 muon_digits.C:139
 muon_digits.C:140
 muon_digits.C:141
 muon_digits.C:142
 muon_digits.C:143
 muon_digits.C:144
 muon_digits.C:145
 muon_digits.C:146
 muon_digits.C:147
 muon_digits.C:148
 muon_digits.C:149