ROOT logo
/**************************************************************************
 * Copyright(c) 2008, Christian Holm Christensen                          *
 *                                                                        *
 * Author: Christian Holm Christensen.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation for any 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 remains      *
 * intact.  The authors make no claims about the suitability of this      * 
 * software for any purpose. It is provided "as is" without express or    *
 * implied warranty.                                      		  * 
 **************************************************************************/
/* $Id$ */
/** @file    AliEveFMDLoader.cxx
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Sun Mar 26 17:59:18 2006
    @brief   Implementation of AliEveFMDLoader singleton class 
*/
//____________________________________________________________________
//                                                                          
// Forward Multiplicity Detector based on Silicon wafers. This class
// is the loader for the event display. 
//
// This class is a singleton, meaning that there's only one instance
// of this.  This is done to speed up the processing by putting all
// things that are needed every time into the constructor. 
//
#include "AliRunLoader.h"
#include "EveBase/AliEveEventManager.h"
#include "AliEveFMDLoader.h"
#include "../FMD/AliFMDUShortMap.h"
#include "../FMD/AliFMDBoolMap.h"
#include "../FMD/AliFMDGeometry.h"
#include "../FMD/AliFMDParameters.h"
#include "../FMD/AliFMDDetector.h"
#include "../FMD/AliFMDRing.h"
#include "../FMD/AliFMDBaseDigit.h"
#include "../FMD/AliFMDDigit.h"
#include "../FMD/AliFMDRawReader.h"
#include "../FMD/AliFMDHit.h"
#include "AliESDEvent.h"
#include "AliESDFMD.h"
#include "AliLog.h"
#include "AliRawReader.h"
#include <TClonesArray.h>
#include <TTree.h>
#include <TGeoShape.h>
#include <TGeoManager.h>
#include <TEveGeoNode.h>
#include <TEveBoxSet.h>
#include <TEveQuadSet.h>
#include <TEveManager.h>
#include <TEveUtil.h>
#include <TStyle.h>
#include <TMath.h>
#include <iostream>

// Some very private variables. 
namespace 
{
  const Char_t* kDetector = "FMD%d";
  const Char_t* kRing     = "FMD%d%c";
  const Char_t* kModule   = "FMD%d%c[%02d-%02d]";
  const Char_t* kSector   = "FMD%d%c[%02d] %s";

  const Char_t* kHits     = "Hits";
  const Char_t* kDigits   = "Digits";
  const Char_t* kRaw      = "Raw";
  const Char_t* kESD      = "ESD";
  
}

//____________________________________________________________________
AliEveFMDLoader* AliEveFMDLoader::fgInstance = 0;

//____________________________________________________________________
AliEveFMDLoader* AliEveFMDLoader::Instance()
{
  // Get the singleton instance.  If the instance has not been
  // instantised yet, it will be after this call.
  if (!fgInstance) 
    fgInstance = new AliEveFMDLoader();
  return fgInstance;
}

//____________________________________________________________________
AliEveFMDLoader::AliEveFMDLoader(const char* name, Bool_t useBoxes, 
				 Bool_t /* old */)
  : TEveElementList(name, 0), 
    fHitPalette(0, 1000),
    fDigitPalette(0, 1023), 
    fMultPalette(0, 20),
    fUseBoxDigits(useBoxes), 
    fHitCache("AliFMDHit",0),
    fDigitCache("AliFMDDigit", 0),
    fRawCache("AliFMDDigit", 0)
{
  // Constructor 
  // Parameters:
  // @param name     Name of the folder. 
  // @param useBoxes Whether to use boxes or Quads for the signals 
  // @param old      Whether to enable reading old RCU data format

  // increase reference count 
  IncDenyDestroy();
  
  // Increase reference counts on palettes 
  fHitPalette.IncRefCount();
  fDigitPalette.IncRefCount();
  fMultPalette.IncRefCount();
  
  
  // Initialize the FMD geometry manager 
  TGeoManager* geoMan  = AliEveEventManager::AssertGeometry();
  if (!geoMan) return;
  geoMan->GetTopVolume()->cd(0);

  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  geom->Init();
  geom->InitTransformations();

  AliFMDParameters* pars = AliFMDParameters::Instance();
  // pars->UseRcuTrailer(!old);
  // pars->UseCompleteHeader(old);
  // pars->SetSampleRate(4);
  pars->Init(kFALSE, 0);

  // Get shapes
  TGeoShape* inner = static_cast<TGeoShape*>(gGeoManager->GetListOfShapes()
					     ->FindObject("FMDI_physical_sensor"));
  if (!inner) throw TEveException("Shape of inner type sensors not found");
  TGeoShape* outer = static_cast<TGeoShape*>(gGeoManager->GetListOfShapes()
					     ->FindObject("FMDO_physical_sensor"));
  if (!outer) throw TEveException("Shape of outer type sensors not found");

  // Emulate reference counting 
  inner->SetUniqueID(1000);
  outer->SetUniqueID(1000);
  
  // Loop over detectors 
  for (UShort_t d = 1; d <= 3; d++) { 
    AliFMDDetector*  detector = geom->GetDetector(d);
    if (!detector) continue;
    TEveElementList* ed       = new TEveElementList(Form(kDetector, 
							 detector->GetId()));
    AddElement(ed);
    ed->IncDenyDestroy();
    ed->SetUserData(detector);

    // Loop over rings 
    Char_t           rings[]  = { 'I', 'O', 0 };
    Char_t*          pr       = &(rings[0]);
    while (*pr) { 
      AliFMDRing* ring = detector->GetRing(*pr);
      pr++;
      if (!ring) continue;
      TEveElementList* er      = new TEveElementList(Form(kRing, 
							  detector->GetId(),
							  ring->GetId()));
      ed->AddElement(er);
      er->IncDenyDestroy();
      er->SetUserData(ring);
      
      // UShort_t      nsec    = ring->GetNSectors();
      // UShort_t      nstr    = ring->GetNStrips();
      UShort_t         nmod    = ring->GetNModules();
      // Loop over modules 
      for (UShort_t m = 0; m < nmod; m++) { 
	TEveGeoShape* em = new TEveGeoShape(Form(kModule, 
						 detector->GetId(),
						 ring->GetId(), 
						 2*m, 2*m+1));
	er->AddElement(em);
	em->SetTransMatrix(*(detector->FindTransform(ring->GetId(), 2*m)));
	em->SetShape(ring->GetId() == 'I' ? inner : outer);
	em->SetMainColor(Color_t(kGray));
	em->SetMainTransparency(32);
	em->IncDenyDestroy();
	ModuleData* data = new ModuleData;
	data->fScaledSum = 0;
	em->SetUserData(data);

#if 0
	for (UShort_t s = 2*m; s < 2*m+2 && s < nsec; s++) { 
	  TEveDigitSet* eb = MakeDigitSet(Form(kSector,
					       detector->GetId(), 
					       ring->GetId(), s), nstr);
	  em->AddElement(eb);
	  eb->SetEmitSignals(kFALSE);
	  eb->SetPickable(kTRUE);
	  // eb->SetOwnIds(kTRUE);
	} // for (UShort_t s ...)
#endif
      }  // for (UShort_t m ...)
    }  // while (pr)
  }  // for (UShort_t d ...)
}

//____________________________________________________________________
AliEveFMDLoader::~AliEveFMDLoader()
{
  // Destructor
  AliWarning("AliEveFMDLoader being destroyed!");
}

//____________________________________________________________________
Int_t
AliEveFMDLoader::RemoveFromListTrees(TEveElement* el)
{
  // Called when the element should be removed from the list. We
  // overload this to allow clearing of signals.
  // Parameters:
  // @param el Tree to remove from.

  // Since we're most likely setting up for a new event, we clear all
  // signals here - a little tricky, but it works(tm). 
  ClearDigitSets("All");
  
  // Do normal TEveElement::RemoveElement
  return TEveElementList::RemoveFromListTrees(el);
}
//____________________________________________________________________
void
AliEveFMDLoader::RemoveParent(TEveElement* el)
{
  // Called when the element should be removed from the list. We
  // overload this to allow clearing of signals.
  // Parameters:
  // @param el Parent to remove from.
  TEveElementList::RemoveParent(el);
}

//____________________________________________________________________
TEveDigitSet* 
AliEveFMDLoader::MakeDigitSet(const char* name, UShort_t nstr)
{
  // Make a digit set.  The type of digit set depends on the setting
  // of fUseBoxDigits.  If this is true, we return a TEveBoxSet,
  // otherwise a TEveQuadSet   
  // Parameters: 
  //    name	The name 
  //	nstr	The number of strips 
  // Return 
  //    newly allocated digit set
  TEveDigitSet* ret = 0;
  if (fUseBoxDigits) { 
    TEveBoxSet* boxes = new TEveBoxSet(name);
    // boxes->Reset(TEveBoxSet::kBT_AABox, kFALSE, nstr);
    boxes->Reset(TEveBoxSet::kBT_FreeBox, kFALSE, nstr);
    ret = boxes;
  }
  else { 
    TEveQuadSet* quads = new TEveQuadSet(name);
    quads->Reset(TEveQuadSet::kQT_RectangleXY, kFALSE, nstr);
    ret = quads;
  }
  return ret;
}

//____________________________________________________________________
void
AliEveFMDLoader::ClearDigitSets(const char* type)
{
  // Clear signals of some type.   
  // Parameters:
  // @param type Type of signals to clear 
  //     Type can be one of 
  //     - All    All signals 
  //     - Hits   Hits 
  //     - Digits Digits 
  //     - Raw    Raw 
  //     - ESD    ESD 
  TString stype(type);

  for (TEveElement::List_i di = BeginChildren(); 
       di != EndChildren(); ++di) { 
    for (TEveElement::List_i ri = (*di)->BeginChildren(); 
	 ri != (*di)->EndChildren(); ++ri) { 
      for (TEveElement::List_i mi = (*ri)->BeginChildren();
	   mi != (*ri)->EndChildren(); ++mi) { 
	ModuleData* data = static_cast<ModuleData*>((*mi)->GetUserData());
	data->fScaledSum = 0;
	(*mi)->SetMainColor(Color_t(kGray));
	if (stype == "All") {
	  (*mi)->RemoveElements();
	  continue;
	}
	for (TEveElement::List_i si = (*mi)->BeginChildren(); 
	     si != (*mi)->EndChildren(); ++si) { 
	  TEveDigitSet* signals = static_cast<TEveDigitSet*>((*si));
	  if (!signals) continue;
	  TString s(signals->GetName());
	  if (!s.Contains(type)) continue;
	  (*mi)->RemoveElement(signals);
	}
      }
    }
  }
}

//____________________________________________________________________
TEveDigitSet*
AliEveFMDLoader::FindDigitSet(const char* t, UShort_t d, Char_t r, UShort_t s)
{
  // Find a digit set corresponding to the passed parameters.  If it
  // is not found, one is created
  // Parameters:
  // @param type   Type of data 
  // @param d      Detector 
  // @param r      Ring 
  // @param s      Sector 
  // @return a digit set
  TEveElement* detector = FindChild(Form(kDetector, d));
  if (!detector) { 
    AliError(Form("Detector %s not found", Form(kDetector, d)));
    return 0;
  }
  
  TEveElement* ring = detector->FindChild(Form(kRing, d, r));
  if (!ring) { 
    AliError(Form("Ring %s not found", Form(kRing, d, r)));
    return 0;
  }
  
  Int_t mod = 2*(s/2);
  TEveElement* module = ring->FindChild(Form(kModule, d, r, mod, mod+1));
  if (!module) { 
    AliError(Form("Module %s not found", Form(kModule, d, r, s, s+1)));
    return 0;
  }
  
  TEveElement*  sector = module->FindChild(Form(kSector, d, r, s, t));
  TEveDigitSet* signal = static_cast<TEveDigitSet*>(sector);
  if (!sector) { 
    AliFMDRing* rng = AliFMDGeometry::Instance()->GetRing(r);
    signal = MakeDigitSet(Form(kSector, d, r, s, t), rng->GetNStrips());
    module->AddElement(signal);
    signal->SetEmitSignals(kFALSE);
    signal->SetPickable(kTRUE);
    TString st(t);
    if      (t == kHits)   signal->SetPalette(&fHitPalette);
    else if (t == kDigits) signal->SetPalette(&fDigitPalette);
    else if (t == kRaw)    signal->SetPalette(&fDigitPalette);
    else if (t == kESD) {
      signal->SetPalette(&fMultPalette);
      signal->SetOwnIds(kTRUE);
    }    
  }
  return signal;
}

//____________________________________________________________________
void
AliEveFMDLoader::AddSignal(const char* t, 
			   UShort_t det, Char_t rng, UShort_t sec, 
			   UShort_t str, Float_t signal, Float_t min, 
			   Float_t  max, TObject* ref)
{
  // Add a signal to a digit set
  // Parameters:
  // @param type   Type of data 
  // @param det    Detector 
  // @param rng    Ring 
  // @param sec    Sector 
  // @param str    Strip
  // @param signal Signal value 
  // @param min    Minimum of this kind of signal 
  // @param max    Maximum of this kind of signal 
  // @param ref    Reference object 
  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  Double_t x, y, z;
  geom->Detector2XYZ(det, rng, sec, str, x, y, z);
  AddSignal(t, det, rng, sec, str, x, y, z, signal, min, max, ref);
}

//____________________________________________________________________
void
AliEveFMDLoader::AddSignal(const char* t, 
			   UShort_t det, Char_t rng, UShort_t sec, 
			   UShort_t str, Double_t x, Double_t y, Double_t z, 
			   Float_t signal, Float_t min, Float_t  max, 
			   TObject* ref)
{
  // Add a signal to a digit set, with known (x,y,z) coordinates
  // (this is for hits)
  // Parameters:
  // @param type   Type of data 
  // @param det    Detector 
  // @param rng    Ring 
  // @param sec    Sector 
  // @param str    Strip
  // @param x      X coordinate  
  // @param y      Y coordinate  
  // @param z      Z coordinate  
  // @param signal Signal value 
  // @param min    Minimum of this kind of signal 
  // @param max    Maximum of this kind of signal 
  // @param ref    Reference object 
  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  AliFMDRing*     ring = geom->GetRing(rng);
  if (!ring) return;

  TEveDigitSet* signals = FindDigitSet(t, det, rng, sec);
  if (!signals) { 
    AliWarning(Form("No signal (%s) found for FMD%d%c[%02d,%03d]", 
		    t, det, rng, sec, str));
    return;
  }
  
  Float_t  scaled = TMath::Min((signal - min) / (max - min) * 10., 10.);
  if ((scaled - min) < 1e-6) { 
    // Very small (scalled) signals are ignored 
    AliDebug(10, Form("Skipping small %s signal at FMD%d%c[%02d,%03d]=%f (s-min=%f<1e-6)", 
		      t, det, rng, sec, str, signal, scaled-min));
    return;
  }
  Double_t w      = 2*ring->GetPitch();
  Int_t    value  = int(TMath::Nint(signal));
  AliDebug(5, Form("New %s signal at FMD%d%c[%02d,%03d]=%f (v=%d, s=%f)", 
		   t, det, rng, sec, str, signal, value, scaled));
  AddDigit(signals, x, y, z, w, scaled, value, ref);
}

//____________________________________________________________________
void
AliEveFMDLoader::AddDigit(TEveDigitSet* signals, 
			  Double_t x, Double_t y, Double_t z, 
			  Double_t w, Float_t scaled, Int_t value, 
			  TObject* ref)
{
  // Add a digit to a digit set. 
  // Parameters:
  // @param signals Digit set. 
  // @param x      X coordinate  
  // @param y      Y coordinate  
  // @param z      Z coordinate  
  // @param w      strip pitch 
  // @param scaled Scaled value 
  // @param value  Signal value 
  // @param ref    Reference object
  if (fUseBoxDigits) { 
    TEveBoxSet* boxes = static_cast<TEveBoxSet*>(signals);
    Float_t fw   = w;
    Float_t zc   = (z > 0 ? -1 : 1) * scaled + z;
    Float_t vs[] = { -fw, -5*fw, zc-scaled,   // Lower back  left
		     +fw, -5*fw, zc-scaled,   // Lower back  right
		     +fw, +5*fw, zc-scaled,   // Lower front right
		     -fw, +5*fw, zc-scaled,   // Lower front left 
		     -fw, -5*fw, zc+scaled,   // Upper back  left
		     +fw, -5*fw, zc+scaled,   // Upper back  right
		     +fw, +5*fw, zc+scaled,   // Upper front right
		     -fw, +5*fw, zc+scaled }; // Upper front left
    Float_t ang  = TMath::ATan2(y,x);
    for (size_t i = 0; i < 8; i++) { 
      Float_t bx = vs[3*i+0];
      Float_t by = vs[3*i+1];
      Float_t ca = TMath::Cos(ang);
      Float_t sa = TMath::Sin(ang);
      vs[3*i+0]  = bx * ca - by * sa + x;
      vs[3*i+1]  = bx * sa + by * ca + y;
    }
    // boxes->AddBox(x, y, (z > 0 ? -scaled : 0) + z , 5*w, w, scaled);
    boxes->AddBox(vs);
    boxes->DigitValue(value);
    if (ref) boxes->DigitId(ref);
  }
  else { 
    TEveQuadSet* quads = static_cast<TEveQuadSet*>(signals);
    quads->AddQuad(x,y,z,w,w);
    quads->QuadValue(value);
    if (ref) quads->QuadId(ref);
  }
  TEveElement* par  = *(signals->BeginParents());
  ModuleData*  data = static_cast<ModuleData*>(par->GetUserData());
  int          maxD = 0;
  switch (signals->GetName()[4]) { 
  case 'I': case 'i': maxD = 2 * 512; break;
  case 'O': case 'o': maxD = 2 * 256; break;
  default:  return;
  }
  data->fScaledSum += scaled / maxD;
}
//____________________________________________________________________
void
AliEveFMDLoader::SummarizeModule(TEveElement* module)
{
  // Modify color of module according to the summed signal
  ModuleData*  data = static_cast<ModuleData*>(module->GetUserData());
  Float_t      sum  = data->fScaledSum / module->NumChildren();
  if (sum <= 1e-6) {
    module->SetMainColor(Color_t(kGray));
    module->SetMainAlpha(0);
    return;
  }


  /* The sum stored is 
   * 
   *  1/N 1/M_max   S_i^N S_j^M_i x_ij 
   *
   * where i runs over the number (N) of digit sets in the module 
   * (zero or more of  Hits, Digits, Raw, ESD, i.e., in the range from
   * 0 to 4), j runs over the number of digits (M_i) in a single digit
   * set, M_max is the possible number of digits sets in each module 
   * (2*256 for outer rings, 2*512 for inner rings), and x_ij is the 
   * scaled signal (according to the colour palette for the signal in 
   * question) multiplied by 10 i.e., 
   * 
   *   x_ij = 10 * (s_ij - s_min,i) / (s_max,i - s_min,i)
   * 
   * Here, s_ij is the basic signal (E-loss, ADC, or multiplicity), 
   * and s_min,i and s_max,i are the corresponding limits. 
   *
   * Hence, the scaled sum above is in the range from 0 to 10.  
   *
   * To use one of the palettes, we need to scale this number to the 
   * range set in the palette and cast it to an integer. 
   */
  int min  = fMultPalette.GetMinVal();
  int max  = fMultPalette.GetMaxVal();
  int cidx = int(sum/10 * (max-min) + min);
  UChar_t pix[3];
  fMultPalette.ColorFromValue(cidx, pix, false);
  module->SetMainColorRGB(pix[0], pix[1], pix[2]);
  module->SetMainAlpha(0.33);
}

//____________________________________________________________________
void
AliEveFMDLoader::SummarizeModules()
{
  // Summarize the signals in the all the modules, and modify 
  // the module colour accordingly 
  
  for (TEveElement::List_i di = BeginChildren(); 
       di != EndChildren(); ++di) { 
    for (TEveElement::List_i ri = (*di)->BeginChildren(); 
	 ri != (*di)->EndChildren(); ++ri) { 
      for (TEveElement::List_i mi = (*ri)->BeginChildren();
	   mi != (*ri)->EndChildren(); ++mi) { 

	TEveElement* module = *mi;
	SummarizeModule(module);
      }
    }
  }
}
//____________________________________________________________________
void
AliEveFMDLoader::CheckAdd()
{
  // check if we shoul re-add ourselves to the current event node 
  TEveElement* event = gEve->GetCurrentEvent();
  SummarizeModules();
  if (event && event->FindChild(GetName())) return;
  gEve->AddElement(this);
}


//____________________________________________________________________
void
AliEveFMDLoader::LoadHits()
{
  // Load and display hits
  ClearDigitSets(kHits);

  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
  if (!rl) { 
    AliError("No run loader");
    return;
  }
  
  rl->LoadHits("FMD");
  TTree* ht = rl->GetTreeH("FMD", false);
  if (!ht) { 
    AliError("No FMD tree");
    return;
  }
  
  TClonesArray* hits = &fHitCache;
  fHitCache.Clear();
  ht->SetBranchAddress("FMD", &hits);

  Float_t min = fHitPalette.GetMinVal();
  Float_t max = fHitPalette.GetMaxVal();

  Int_t nTracks = ht->GetEntriesFast();
  for (Int_t i = 0; i < nTracks; i++) {
    Int_t hitRead  = ht->GetEntry(i);
    if (hitRead <= 0) continue;

    Int_t nHit = hits->GetEntriesFast();
    if (nHit <= 0) continue;
  
    for (Int_t j = 0; j < nHit; j++) {
      AliFMDHit* hit = static_cast<AliFMDHit*>(hits->At(j));
      if (!hit) continue;
  
      AddSignal(kHits, 
		hit->Detector(), hit->Ring(), hit->Sector(), hit->Strip(),
		hit->X(), hit->Y(), hit->Z(), int(hit->Edep()*1000), 
		min, max, hit);
    }
  }
  CheckAdd();
}

//____________________________________________________________________
void
AliEveFMDLoader::DoLoadDigits(const char* t, TClonesArray* digits)
{
  // Do the actual display of digits 
  // Parameters:
  // @param type What to show 
  // @param digits The digits
  Float_t min = fDigitPalette.GetMinVal();
  Float_t max = fDigitPalette.GetMaxVal();

  Int_t n = digits->GetEntriesFast();
  for (Int_t i = 0; i < n; i++) { 
    AliFMDDigit* digit = static_cast<AliFMDDigit*>(digits->At(i));
    if (!digit) return;
    AddSignal(t, digit->Detector(), digit->Ring(), digit->Sector(),
	      digit->Strip(), digit->Counts(), min, max, digit);
  }
  CheckAdd();
}

//____________________________________________________________________
void
AliEveFMDLoader::LoadDigits()
{
  // Load and display simulated digits 
  ClearDigitSets(kDigits);

  AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
  if (!rl) { 
    AliError("No run-loader");
    return;
  }
  
  rl->LoadDigits("FMD");
  TTree* dt = rl->GetTreeD("FMD", false);
  if (!dt) { 
    AliError("No FMD tree");
    return;
  }
  
  TClonesArray* digits = &fDigitCache;
  fDigitCache.Clear();
  dt->SetBranchAddress("FMD", &digits);

  Int_t read = dt->GetEntry(0);
  if (read <= 0) { 
    AliWarning("Nothing read");
    return;
  }
  DoLoadDigits(kDigits, digits);
}


//____________________________________________________________________
void
AliEveFMDLoader::LoadRaw()
{
  // Load and display raw digits 
  ClearDigitSets(kRaw);

  AliRawReader* rr =  AliEveEventManager::AssertRawReader();
  if (!rr) { 
    AliError("No raw-reader");
    return;
  }
  rr->Reset();
  AliFMDRawReader* fr = new AliFMDRawReader(rr, 0);
  TClonesArray* digits = &fRawCache;
  fRawCache.Clear();
  
  fr->ReadAdcs(digits);
  
  DoLoadDigits(kRaw, digits);
}

//____________________________________________________________________
void
AliEveFMDLoader::LoadESD()
{
  // Load and display ESD information 
  
  ClearDigitSets(kESD);

  AliESDEvent* esd =  AliEveEventManager::AssertESD();
  if (!esd) { 
    AliError("No ESD");
    return;
  }

  AliESDFMD* fmd = esd->GetFMDData();
  if (!fmd) { 
    AliError("No FMD ESD data");
    return;
  }

  Float_t min = fMultPalette.GetMinVal();
  Float_t max = fMultPalette.GetMaxVal();
  
  for (UShort_t det = 1; det <= 3; det++) {
    Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'), '\0' };
    for (Char_t* rng = rings; *rng != '\0'; rng++) {
      UShort_t nsec = (*rng == 'I' ?  20 :  40);
      UShort_t nstr = (*rng == 'I' ? 512 : 256);
      for (UShort_t sec = 0; sec < nsec; sec++) {
	for (UShort_t str = 0; str < nstr; str++) {
	  Float_t mult = fmd->Multiplicity(det,*rng,sec,str);
	  if (mult == AliESDFMD::kInvalidMult) continue;
	  Float_t eta  = fmd->Eta(det,*rng,sec,str);
	  
        // As it was before, it causes big memory leak:
//        AddSignal(kESD, det, *rng, sec, str, mult, min, max,
//                  new TNamed(Form("FMD%d%c[%02d,%03d]", det, *rng, sec, str),
//                             Form("Mch=%f, eta=%f", mult, eta)));
                
        // I propose to replace it with:
        TNamed *tmpNamed = new TNamed(Form("FMD%d%c[%02d,%03d]", det, *rng, sec, str),Form("Mch=%f, eta=%f", mult, eta));
        AddSignal(kESD, det, *rng, sec, str, mult, min, max,tmpNamed);
        if(tmpNamed)delete tmpNamed;
        //
        
	}
      }
    }
  }
  CheckAdd();
}
  
//____________________________________________________________________
//
// EOF
//
 AliEveFMDLoader.cxx:1
 AliEveFMDLoader.cxx:2
 AliEveFMDLoader.cxx:3
 AliEveFMDLoader.cxx:4
 AliEveFMDLoader.cxx:5
 AliEveFMDLoader.cxx:6
 AliEveFMDLoader.cxx:7
 AliEveFMDLoader.cxx:8
 AliEveFMDLoader.cxx:9
 AliEveFMDLoader.cxx:10
 AliEveFMDLoader.cxx:11
 AliEveFMDLoader.cxx:12
 AliEveFMDLoader.cxx:13
 AliEveFMDLoader.cxx:14
 AliEveFMDLoader.cxx:15
 AliEveFMDLoader.cxx:16
 AliEveFMDLoader.cxx:17
 AliEveFMDLoader.cxx:18
 AliEveFMDLoader.cxx:19
 AliEveFMDLoader.cxx:20
 AliEveFMDLoader.cxx:21
 AliEveFMDLoader.cxx:22
 AliEveFMDLoader.cxx:23
 AliEveFMDLoader.cxx:24
 AliEveFMDLoader.cxx:25
 AliEveFMDLoader.cxx:26
 AliEveFMDLoader.cxx:27
 AliEveFMDLoader.cxx:28
 AliEveFMDLoader.cxx:29
 AliEveFMDLoader.cxx:30
 AliEveFMDLoader.cxx:31
 AliEveFMDLoader.cxx:32
 AliEveFMDLoader.cxx:33
 AliEveFMDLoader.cxx:34
 AliEveFMDLoader.cxx:35
 AliEveFMDLoader.cxx:36
 AliEveFMDLoader.cxx:37
 AliEveFMDLoader.cxx:38
 AliEveFMDLoader.cxx:39
 AliEveFMDLoader.cxx:40
 AliEveFMDLoader.cxx:41
 AliEveFMDLoader.cxx:42
 AliEveFMDLoader.cxx:43
 AliEveFMDLoader.cxx:44
 AliEveFMDLoader.cxx:45
 AliEveFMDLoader.cxx:46
 AliEveFMDLoader.cxx:47
 AliEveFMDLoader.cxx:48
 AliEveFMDLoader.cxx:49
 AliEveFMDLoader.cxx:50
 AliEveFMDLoader.cxx:51
 AliEveFMDLoader.cxx:52
 AliEveFMDLoader.cxx:53
 AliEveFMDLoader.cxx:54
 AliEveFMDLoader.cxx:55
 AliEveFMDLoader.cxx:56
 AliEveFMDLoader.cxx:57
 AliEveFMDLoader.cxx:58
 AliEveFMDLoader.cxx:59
 AliEveFMDLoader.cxx:60
 AliEveFMDLoader.cxx:61
 AliEveFMDLoader.cxx:62
 AliEveFMDLoader.cxx:63
 AliEveFMDLoader.cxx:64
 AliEveFMDLoader.cxx:65
 AliEveFMDLoader.cxx:66
 AliEveFMDLoader.cxx:67
 AliEveFMDLoader.cxx:68
 AliEveFMDLoader.cxx:69
 AliEveFMDLoader.cxx:70
 AliEveFMDLoader.cxx:71
 AliEveFMDLoader.cxx:72
 AliEveFMDLoader.cxx:73
 AliEveFMDLoader.cxx:74
 AliEveFMDLoader.cxx:75
 AliEveFMDLoader.cxx:76
 AliEveFMDLoader.cxx:77
 AliEveFMDLoader.cxx:78
 AliEveFMDLoader.cxx:79
 AliEveFMDLoader.cxx:80
 AliEveFMDLoader.cxx:81
 AliEveFMDLoader.cxx:82
 AliEveFMDLoader.cxx:83
 AliEveFMDLoader.cxx:84
 AliEveFMDLoader.cxx:85
 AliEveFMDLoader.cxx:86
 AliEveFMDLoader.cxx:87
 AliEveFMDLoader.cxx:88
 AliEveFMDLoader.cxx:89
 AliEveFMDLoader.cxx:90
 AliEveFMDLoader.cxx:91
 AliEveFMDLoader.cxx:92
 AliEveFMDLoader.cxx:93
 AliEveFMDLoader.cxx:94
 AliEveFMDLoader.cxx:95
 AliEveFMDLoader.cxx:96
 AliEveFMDLoader.cxx:97
 AliEveFMDLoader.cxx:98
 AliEveFMDLoader.cxx:99
 AliEveFMDLoader.cxx:100
 AliEveFMDLoader.cxx:101
 AliEveFMDLoader.cxx:102
 AliEveFMDLoader.cxx:103
 AliEveFMDLoader.cxx:104
 AliEveFMDLoader.cxx:105
 AliEveFMDLoader.cxx:106
 AliEveFMDLoader.cxx:107
 AliEveFMDLoader.cxx:108
 AliEveFMDLoader.cxx:109
 AliEveFMDLoader.cxx:110
 AliEveFMDLoader.cxx:111
 AliEveFMDLoader.cxx:112
 AliEveFMDLoader.cxx:113
 AliEveFMDLoader.cxx:114
 AliEveFMDLoader.cxx:115
 AliEveFMDLoader.cxx:116
 AliEveFMDLoader.cxx:117
 AliEveFMDLoader.cxx:118
 AliEveFMDLoader.cxx:119
 AliEveFMDLoader.cxx:120
 AliEveFMDLoader.cxx:121
 AliEveFMDLoader.cxx:122
 AliEveFMDLoader.cxx:123
 AliEveFMDLoader.cxx:124
 AliEveFMDLoader.cxx:125
 AliEveFMDLoader.cxx:126
 AliEveFMDLoader.cxx:127
 AliEveFMDLoader.cxx:128
 AliEveFMDLoader.cxx:129
 AliEveFMDLoader.cxx:130
 AliEveFMDLoader.cxx:131
 AliEveFMDLoader.cxx:132
 AliEveFMDLoader.cxx:133
 AliEveFMDLoader.cxx:134
 AliEveFMDLoader.cxx:135
 AliEveFMDLoader.cxx:136
 AliEveFMDLoader.cxx:137
 AliEveFMDLoader.cxx:138
 AliEveFMDLoader.cxx:139
 AliEveFMDLoader.cxx:140
 AliEveFMDLoader.cxx:141
 AliEveFMDLoader.cxx:142
 AliEveFMDLoader.cxx:143
 AliEveFMDLoader.cxx:144
 AliEveFMDLoader.cxx:145
 AliEveFMDLoader.cxx:146
 AliEveFMDLoader.cxx:147
 AliEveFMDLoader.cxx:148
 AliEveFMDLoader.cxx:149
 AliEveFMDLoader.cxx:150
 AliEveFMDLoader.cxx:151
 AliEveFMDLoader.cxx:152
 AliEveFMDLoader.cxx:153
 AliEveFMDLoader.cxx:154
 AliEveFMDLoader.cxx:155
 AliEveFMDLoader.cxx:156
 AliEveFMDLoader.cxx:157
 AliEveFMDLoader.cxx:158
 AliEveFMDLoader.cxx:159
 AliEveFMDLoader.cxx:160
 AliEveFMDLoader.cxx:161
 AliEveFMDLoader.cxx:162
 AliEveFMDLoader.cxx:163
 AliEveFMDLoader.cxx:164
 AliEveFMDLoader.cxx:165
 AliEveFMDLoader.cxx:166
 AliEveFMDLoader.cxx:167
 AliEveFMDLoader.cxx:168
 AliEveFMDLoader.cxx:169
 AliEveFMDLoader.cxx:170
 AliEveFMDLoader.cxx:171
 AliEveFMDLoader.cxx:172
 AliEveFMDLoader.cxx:173
 AliEveFMDLoader.cxx:174
 AliEveFMDLoader.cxx:175
 AliEveFMDLoader.cxx:176
 AliEveFMDLoader.cxx:177
 AliEveFMDLoader.cxx:178
 AliEveFMDLoader.cxx:179
 AliEveFMDLoader.cxx:180
 AliEveFMDLoader.cxx:181
 AliEveFMDLoader.cxx:182
 AliEveFMDLoader.cxx:183
 AliEveFMDLoader.cxx:184
 AliEveFMDLoader.cxx:185
 AliEveFMDLoader.cxx:186
 AliEveFMDLoader.cxx:187
 AliEveFMDLoader.cxx:188
 AliEveFMDLoader.cxx:189
 AliEveFMDLoader.cxx:190
 AliEveFMDLoader.cxx:191
 AliEveFMDLoader.cxx:192
 AliEveFMDLoader.cxx:193
 AliEveFMDLoader.cxx:194
 AliEveFMDLoader.cxx:195
 AliEveFMDLoader.cxx:196
 AliEveFMDLoader.cxx:197
 AliEveFMDLoader.cxx:198
 AliEveFMDLoader.cxx:199
 AliEveFMDLoader.cxx:200
 AliEveFMDLoader.cxx:201
 AliEveFMDLoader.cxx:202
 AliEveFMDLoader.cxx:203
 AliEveFMDLoader.cxx:204
 AliEveFMDLoader.cxx:205
 AliEveFMDLoader.cxx:206
 AliEveFMDLoader.cxx:207
 AliEveFMDLoader.cxx:208
 AliEveFMDLoader.cxx:209
 AliEveFMDLoader.cxx:210
 AliEveFMDLoader.cxx:211
 AliEveFMDLoader.cxx:212
 AliEveFMDLoader.cxx:213
 AliEveFMDLoader.cxx:214
 AliEveFMDLoader.cxx:215
 AliEveFMDLoader.cxx:216
 AliEveFMDLoader.cxx:217
 AliEveFMDLoader.cxx:218
 AliEveFMDLoader.cxx:219
 AliEveFMDLoader.cxx:220
 AliEveFMDLoader.cxx:221
 AliEveFMDLoader.cxx:222
 AliEveFMDLoader.cxx:223
 AliEveFMDLoader.cxx:224
 AliEveFMDLoader.cxx:225
 AliEveFMDLoader.cxx:226
 AliEveFMDLoader.cxx:227
 AliEveFMDLoader.cxx:228
 AliEveFMDLoader.cxx:229
 AliEveFMDLoader.cxx:230
 AliEveFMDLoader.cxx:231
 AliEveFMDLoader.cxx:232
 AliEveFMDLoader.cxx:233
 AliEveFMDLoader.cxx:234
 AliEveFMDLoader.cxx:235
 AliEveFMDLoader.cxx:236
 AliEveFMDLoader.cxx:237
 AliEveFMDLoader.cxx:238
 AliEveFMDLoader.cxx:239
 AliEveFMDLoader.cxx:240
 AliEveFMDLoader.cxx:241
 AliEveFMDLoader.cxx:242
 AliEveFMDLoader.cxx:243
 AliEveFMDLoader.cxx:244
 AliEveFMDLoader.cxx:245
 AliEveFMDLoader.cxx:246
 AliEveFMDLoader.cxx:247
 AliEveFMDLoader.cxx:248
 AliEveFMDLoader.cxx:249
 AliEveFMDLoader.cxx:250
 AliEveFMDLoader.cxx:251
 AliEveFMDLoader.cxx:252
 AliEveFMDLoader.cxx:253
 AliEveFMDLoader.cxx:254
 AliEveFMDLoader.cxx:255
 AliEveFMDLoader.cxx:256
 AliEveFMDLoader.cxx:257
 AliEveFMDLoader.cxx:258
 AliEveFMDLoader.cxx:259
 AliEveFMDLoader.cxx:260
 AliEveFMDLoader.cxx:261
 AliEveFMDLoader.cxx:262
 AliEveFMDLoader.cxx:263
 AliEveFMDLoader.cxx:264
 AliEveFMDLoader.cxx:265
 AliEveFMDLoader.cxx:266
 AliEveFMDLoader.cxx:267
 AliEveFMDLoader.cxx:268
 AliEveFMDLoader.cxx:269
 AliEveFMDLoader.cxx:270
 AliEveFMDLoader.cxx:271
 AliEveFMDLoader.cxx:272
 AliEveFMDLoader.cxx:273
 AliEveFMDLoader.cxx:274
 AliEveFMDLoader.cxx:275
 AliEveFMDLoader.cxx:276
 AliEveFMDLoader.cxx:277
 AliEveFMDLoader.cxx:278
 AliEveFMDLoader.cxx:279
 AliEveFMDLoader.cxx:280
 AliEveFMDLoader.cxx:281
 AliEveFMDLoader.cxx:282
 AliEveFMDLoader.cxx:283
 AliEveFMDLoader.cxx:284
 AliEveFMDLoader.cxx:285
 AliEveFMDLoader.cxx:286
 AliEveFMDLoader.cxx:287
 AliEveFMDLoader.cxx:288
 AliEveFMDLoader.cxx:289
 AliEveFMDLoader.cxx:290
 AliEveFMDLoader.cxx:291
 AliEveFMDLoader.cxx:292
 AliEveFMDLoader.cxx:293
 AliEveFMDLoader.cxx:294
 AliEveFMDLoader.cxx:295
 AliEveFMDLoader.cxx:296
 AliEveFMDLoader.cxx:297
 AliEveFMDLoader.cxx:298
 AliEveFMDLoader.cxx:299
 AliEveFMDLoader.cxx:300
 AliEveFMDLoader.cxx:301
 AliEveFMDLoader.cxx:302
 AliEveFMDLoader.cxx:303
 AliEveFMDLoader.cxx:304
 AliEveFMDLoader.cxx:305
 AliEveFMDLoader.cxx:306
 AliEveFMDLoader.cxx:307
 AliEveFMDLoader.cxx:308
 AliEveFMDLoader.cxx:309
 AliEveFMDLoader.cxx:310
 AliEveFMDLoader.cxx:311
 AliEveFMDLoader.cxx:312
 AliEveFMDLoader.cxx:313
 AliEveFMDLoader.cxx:314
 AliEveFMDLoader.cxx:315
 AliEveFMDLoader.cxx:316
 AliEveFMDLoader.cxx:317
 AliEveFMDLoader.cxx:318
 AliEveFMDLoader.cxx:319
 AliEveFMDLoader.cxx:320
 AliEveFMDLoader.cxx:321
 AliEveFMDLoader.cxx:322
 AliEveFMDLoader.cxx:323
 AliEveFMDLoader.cxx:324
 AliEveFMDLoader.cxx:325
 AliEveFMDLoader.cxx:326
 AliEveFMDLoader.cxx:327
 AliEveFMDLoader.cxx:328
 AliEveFMDLoader.cxx:329
 AliEveFMDLoader.cxx:330
 AliEveFMDLoader.cxx:331
 AliEveFMDLoader.cxx:332
 AliEveFMDLoader.cxx:333
 AliEveFMDLoader.cxx:334
 AliEveFMDLoader.cxx:335
 AliEveFMDLoader.cxx:336
 AliEveFMDLoader.cxx:337
 AliEveFMDLoader.cxx:338
 AliEveFMDLoader.cxx:339
 AliEveFMDLoader.cxx:340
 AliEveFMDLoader.cxx:341
 AliEveFMDLoader.cxx:342
 AliEveFMDLoader.cxx:343
 AliEveFMDLoader.cxx:344
 AliEveFMDLoader.cxx:345
 AliEveFMDLoader.cxx:346
 AliEveFMDLoader.cxx:347
 AliEveFMDLoader.cxx:348
 AliEveFMDLoader.cxx:349
 AliEveFMDLoader.cxx:350
 AliEveFMDLoader.cxx:351
 AliEveFMDLoader.cxx:352
 AliEveFMDLoader.cxx:353
 AliEveFMDLoader.cxx:354
 AliEveFMDLoader.cxx:355
 AliEveFMDLoader.cxx:356
 AliEveFMDLoader.cxx:357
 AliEveFMDLoader.cxx:358
 AliEveFMDLoader.cxx:359
 AliEveFMDLoader.cxx:360
 AliEveFMDLoader.cxx:361
 AliEveFMDLoader.cxx:362
 AliEveFMDLoader.cxx:363
 AliEveFMDLoader.cxx:364
 AliEveFMDLoader.cxx:365
 AliEveFMDLoader.cxx:366
 AliEveFMDLoader.cxx:367
 AliEveFMDLoader.cxx:368
 AliEveFMDLoader.cxx:369
 AliEveFMDLoader.cxx:370
 AliEveFMDLoader.cxx:371
 AliEveFMDLoader.cxx:372
 AliEveFMDLoader.cxx:373
 AliEveFMDLoader.cxx:374
 AliEveFMDLoader.cxx:375
 AliEveFMDLoader.cxx:376
 AliEveFMDLoader.cxx:377
 AliEveFMDLoader.cxx:378
 AliEveFMDLoader.cxx:379
 AliEveFMDLoader.cxx:380
 AliEveFMDLoader.cxx:381
 AliEveFMDLoader.cxx:382
 AliEveFMDLoader.cxx:383
 AliEveFMDLoader.cxx:384
 AliEveFMDLoader.cxx:385
 AliEveFMDLoader.cxx:386
 AliEveFMDLoader.cxx:387
 AliEveFMDLoader.cxx:388
 AliEveFMDLoader.cxx:389
 AliEveFMDLoader.cxx:390
 AliEveFMDLoader.cxx:391
 AliEveFMDLoader.cxx:392
 AliEveFMDLoader.cxx:393
 AliEveFMDLoader.cxx:394
 AliEveFMDLoader.cxx:395
 AliEveFMDLoader.cxx:396
 AliEveFMDLoader.cxx:397
 AliEveFMDLoader.cxx:398
 AliEveFMDLoader.cxx:399
 AliEveFMDLoader.cxx:400
 AliEveFMDLoader.cxx:401
 AliEveFMDLoader.cxx:402
 AliEveFMDLoader.cxx:403
 AliEveFMDLoader.cxx:404
 AliEveFMDLoader.cxx:405
 AliEveFMDLoader.cxx:406
 AliEveFMDLoader.cxx:407
 AliEveFMDLoader.cxx:408
 AliEveFMDLoader.cxx:409
 AliEveFMDLoader.cxx:410
 AliEveFMDLoader.cxx:411
 AliEveFMDLoader.cxx:412
 AliEveFMDLoader.cxx:413
 AliEveFMDLoader.cxx:414
 AliEveFMDLoader.cxx:415
 AliEveFMDLoader.cxx:416
 AliEveFMDLoader.cxx:417
 AliEveFMDLoader.cxx:418
 AliEveFMDLoader.cxx:419
 AliEveFMDLoader.cxx:420
 AliEveFMDLoader.cxx:421
 AliEveFMDLoader.cxx:422
 AliEveFMDLoader.cxx:423
 AliEveFMDLoader.cxx:424
 AliEveFMDLoader.cxx:425
 AliEveFMDLoader.cxx:426
 AliEveFMDLoader.cxx:427
 AliEveFMDLoader.cxx:428
 AliEveFMDLoader.cxx:429
 AliEveFMDLoader.cxx:430
 AliEveFMDLoader.cxx:431
 AliEveFMDLoader.cxx:432
 AliEveFMDLoader.cxx:433
 AliEveFMDLoader.cxx:434
 AliEveFMDLoader.cxx:435
 AliEveFMDLoader.cxx:436
 AliEveFMDLoader.cxx:437
 AliEveFMDLoader.cxx:438
 AliEveFMDLoader.cxx:439
 AliEveFMDLoader.cxx:440
 AliEveFMDLoader.cxx:441
 AliEveFMDLoader.cxx:442
 AliEveFMDLoader.cxx:443
 AliEveFMDLoader.cxx:444
 AliEveFMDLoader.cxx:445
 AliEveFMDLoader.cxx:446
 AliEveFMDLoader.cxx:447
 AliEveFMDLoader.cxx:448
 AliEveFMDLoader.cxx:449
 AliEveFMDLoader.cxx:450
 AliEveFMDLoader.cxx:451
 AliEveFMDLoader.cxx:452
 AliEveFMDLoader.cxx:453
 AliEveFMDLoader.cxx:454
 AliEveFMDLoader.cxx:455
 AliEveFMDLoader.cxx:456
 AliEveFMDLoader.cxx:457
 AliEveFMDLoader.cxx:458
 AliEveFMDLoader.cxx:459
 AliEveFMDLoader.cxx:460
 AliEveFMDLoader.cxx:461
 AliEveFMDLoader.cxx:462
 AliEveFMDLoader.cxx:463
 AliEveFMDLoader.cxx:464
 AliEveFMDLoader.cxx:465
 AliEveFMDLoader.cxx:466
 AliEveFMDLoader.cxx:467
 AliEveFMDLoader.cxx:468
 AliEveFMDLoader.cxx:469
 AliEveFMDLoader.cxx:470
 AliEveFMDLoader.cxx:471
 AliEveFMDLoader.cxx:472
 AliEveFMDLoader.cxx:473
 AliEveFMDLoader.cxx:474
 AliEveFMDLoader.cxx:475
 AliEveFMDLoader.cxx:476
 AliEveFMDLoader.cxx:477
 AliEveFMDLoader.cxx:478
 AliEveFMDLoader.cxx:479
 AliEveFMDLoader.cxx:480
 AliEveFMDLoader.cxx:481
 AliEveFMDLoader.cxx:482
 AliEveFMDLoader.cxx:483
 AliEveFMDLoader.cxx:484
 AliEveFMDLoader.cxx:485
 AliEveFMDLoader.cxx:486
 AliEveFMDLoader.cxx:487
 AliEveFMDLoader.cxx:488
 AliEveFMDLoader.cxx:489
 AliEveFMDLoader.cxx:490
 AliEveFMDLoader.cxx:491
 AliEveFMDLoader.cxx:492
 AliEveFMDLoader.cxx:493
 AliEveFMDLoader.cxx:494
 AliEveFMDLoader.cxx:495
 AliEveFMDLoader.cxx:496
 AliEveFMDLoader.cxx:497
 AliEveFMDLoader.cxx:498
 AliEveFMDLoader.cxx:499
 AliEveFMDLoader.cxx:500
 AliEveFMDLoader.cxx:501
 AliEveFMDLoader.cxx:502
 AliEveFMDLoader.cxx:503
 AliEveFMDLoader.cxx:504
 AliEveFMDLoader.cxx:505
 AliEveFMDLoader.cxx:506
 AliEveFMDLoader.cxx:507
 AliEveFMDLoader.cxx:508
 AliEveFMDLoader.cxx:509
 AliEveFMDLoader.cxx:510
 AliEveFMDLoader.cxx:511
 AliEveFMDLoader.cxx:512
 AliEveFMDLoader.cxx:513
 AliEveFMDLoader.cxx:514
 AliEveFMDLoader.cxx:515
 AliEveFMDLoader.cxx:516
 AliEveFMDLoader.cxx:517
 AliEveFMDLoader.cxx:518
 AliEveFMDLoader.cxx:519
 AliEveFMDLoader.cxx:520
 AliEveFMDLoader.cxx:521
 AliEveFMDLoader.cxx:522
 AliEveFMDLoader.cxx:523
 AliEveFMDLoader.cxx:524
 AliEveFMDLoader.cxx:525
 AliEveFMDLoader.cxx:526
 AliEveFMDLoader.cxx:527
 AliEveFMDLoader.cxx:528
 AliEveFMDLoader.cxx:529
 AliEveFMDLoader.cxx:530
 AliEveFMDLoader.cxx:531
 AliEveFMDLoader.cxx:532
 AliEveFMDLoader.cxx:533
 AliEveFMDLoader.cxx:534
 AliEveFMDLoader.cxx:535
 AliEveFMDLoader.cxx:536
 AliEveFMDLoader.cxx:537
 AliEveFMDLoader.cxx:538
 AliEveFMDLoader.cxx:539
 AliEveFMDLoader.cxx:540
 AliEveFMDLoader.cxx:541
 AliEveFMDLoader.cxx:542
 AliEveFMDLoader.cxx:543
 AliEveFMDLoader.cxx:544
 AliEveFMDLoader.cxx:545
 AliEveFMDLoader.cxx:546
 AliEveFMDLoader.cxx:547
 AliEveFMDLoader.cxx:548
 AliEveFMDLoader.cxx:549
 AliEveFMDLoader.cxx:550
 AliEveFMDLoader.cxx:551
 AliEveFMDLoader.cxx:552
 AliEveFMDLoader.cxx:553
 AliEveFMDLoader.cxx:554
 AliEveFMDLoader.cxx:555
 AliEveFMDLoader.cxx:556
 AliEveFMDLoader.cxx:557
 AliEveFMDLoader.cxx:558
 AliEveFMDLoader.cxx:559
 AliEveFMDLoader.cxx:560
 AliEveFMDLoader.cxx:561
 AliEveFMDLoader.cxx:562
 AliEveFMDLoader.cxx:563
 AliEveFMDLoader.cxx:564
 AliEveFMDLoader.cxx:565
 AliEveFMDLoader.cxx:566
 AliEveFMDLoader.cxx:567
 AliEveFMDLoader.cxx:568
 AliEveFMDLoader.cxx:569
 AliEveFMDLoader.cxx:570
 AliEveFMDLoader.cxx:571
 AliEveFMDLoader.cxx:572
 AliEveFMDLoader.cxx:573
 AliEveFMDLoader.cxx:574
 AliEveFMDLoader.cxx:575
 AliEveFMDLoader.cxx:576
 AliEveFMDLoader.cxx:577
 AliEveFMDLoader.cxx:578
 AliEveFMDLoader.cxx:579
 AliEveFMDLoader.cxx:580
 AliEveFMDLoader.cxx:581
 AliEveFMDLoader.cxx:582
 AliEveFMDLoader.cxx:583
 AliEveFMDLoader.cxx:584
 AliEveFMDLoader.cxx:585
 AliEveFMDLoader.cxx:586
 AliEveFMDLoader.cxx:587
 AliEveFMDLoader.cxx:588
 AliEveFMDLoader.cxx:589
 AliEveFMDLoader.cxx:590
 AliEveFMDLoader.cxx:591
 AliEveFMDLoader.cxx:592
 AliEveFMDLoader.cxx:593
 AliEveFMDLoader.cxx:594
 AliEveFMDLoader.cxx:595
 AliEveFMDLoader.cxx:596
 AliEveFMDLoader.cxx:597
 AliEveFMDLoader.cxx:598
 AliEveFMDLoader.cxx:599
 AliEveFMDLoader.cxx:600
 AliEveFMDLoader.cxx:601
 AliEveFMDLoader.cxx:602
 AliEveFMDLoader.cxx:603
 AliEveFMDLoader.cxx:604
 AliEveFMDLoader.cxx:605
 AliEveFMDLoader.cxx:606
 AliEveFMDLoader.cxx:607
 AliEveFMDLoader.cxx:608
 AliEveFMDLoader.cxx:609
 AliEveFMDLoader.cxx:610
 AliEveFMDLoader.cxx:611
 AliEveFMDLoader.cxx:612
 AliEveFMDLoader.cxx:613
 AliEveFMDLoader.cxx:614
 AliEveFMDLoader.cxx:615
 AliEveFMDLoader.cxx:616
 AliEveFMDLoader.cxx:617
 AliEveFMDLoader.cxx:618
 AliEveFMDLoader.cxx:619
 AliEveFMDLoader.cxx:620
 AliEveFMDLoader.cxx:621
 AliEveFMDLoader.cxx:622
 AliEveFMDLoader.cxx:623
 AliEveFMDLoader.cxx:624
 AliEveFMDLoader.cxx:625
 AliEveFMDLoader.cxx:626
 AliEveFMDLoader.cxx:627
 AliEveFMDLoader.cxx:628
 AliEveFMDLoader.cxx:629
 AliEveFMDLoader.cxx:630
 AliEveFMDLoader.cxx:631
 AliEveFMDLoader.cxx:632
 AliEveFMDLoader.cxx:633
 AliEveFMDLoader.cxx:634
 AliEveFMDLoader.cxx:635
 AliEveFMDLoader.cxx:636
 AliEveFMDLoader.cxx:637
 AliEveFMDLoader.cxx:638
 AliEveFMDLoader.cxx:639
 AliEveFMDLoader.cxx:640
 AliEveFMDLoader.cxx:641
 AliEveFMDLoader.cxx:642
 AliEveFMDLoader.cxx:643
 AliEveFMDLoader.cxx:644
 AliEveFMDLoader.cxx:645
 AliEveFMDLoader.cxx:646
 AliEveFMDLoader.cxx:647
 AliEveFMDLoader.cxx:648
 AliEveFMDLoader.cxx:649
 AliEveFMDLoader.cxx:650
 AliEveFMDLoader.cxx:651
 AliEveFMDLoader.cxx:652
 AliEveFMDLoader.cxx:653
 AliEveFMDLoader.cxx:654
 AliEveFMDLoader.cxx:655
 AliEveFMDLoader.cxx:656
 AliEveFMDLoader.cxx:657
 AliEveFMDLoader.cxx:658
 AliEveFMDLoader.cxx:659
 AliEveFMDLoader.cxx:660
 AliEveFMDLoader.cxx:661
 AliEveFMDLoader.cxx:662
 AliEveFMDLoader.cxx:663
 AliEveFMDLoader.cxx:664
 AliEveFMDLoader.cxx:665
 AliEveFMDLoader.cxx:666
 AliEveFMDLoader.cxx:667
 AliEveFMDLoader.cxx:668
 AliEveFMDLoader.cxx:669
 AliEveFMDLoader.cxx:670
 AliEveFMDLoader.cxx:671
 AliEveFMDLoader.cxx:672
 AliEveFMDLoader.cxx:673
 AliEveFMDLoader.cxx:674
 AliEveFMDLoader.cxx:675
 AliEveFMDLoader.cxx:676
 AliEveFMDLoader.cxx:677
 AliEveFMDLoader.cxx:678
 AliEveFMDLoader.cxx:679
 AliEveFMDLoader.cxx:680
 AliEveFMDLoader.cxx:681
 AliEveFMDLoader.cxx:682
 AliEveFMDLoader.cxx:683
 AliEveFMDLoader.cxx:684
 AliEveFMDLoader.cxx:685
 AliEveFMDLoader.cxx:686
 AliEveFMDLoader.cxx:687
 AliEveFMDLoader.cxx:688
 AliEveFMDLoader.cxx:689
 AliEveFMDLoader.cxx:690
 AliEveFMDLoader.cxx:691
 AliEveFMDLoader.cxx:692
 AliEveFMDLoader.cxx:693
 AliEveFMDLoader.cxx:694
 AliEveFMDLoader.cxx:695
 AliEveFMDLoader.cxx:696
 AliEveFMDLoader.cxx:697
 AliEveFMDLoader.cxx:698
 AliEveFMDLoader.cxx:699
 AliEveFMDLoader.cxx:700
 AliEveFMDLoader.cxx:701
 AliEveFMDLoader.cxx:702
 AliEveFMDLoader.cxx:703
 AliEveFMDLoader.cxx:704
 AliEveFMDLoader.cxx:705
 AliEveFMDLoader.cxx:706
 AliEveFMDLoader.cxx:707
 AliEveFMDLoader.cxx:708
 AliEveFMDLoader.cxx:709
 AliEveFMDLoader.cxx:710
 AliEveFMDLoader.cxx:711
 AliEveFMDLoader.cxx:712
 AliEveFMDLoader.cxx:713
 AliEveFMDLoader.cxx:714
 AliEveFMDLoader.cxx:715
 AliEveFMDLoader.cxx:716
 AliEveFMDLoader.cxx:717
 AliEveFMDLoader.cxx:718
 AliEveFMDLoader.cxx:719
 AliEveFMDLoader.cxx:720
 AliEveFMDLoader.cxx:721
 AliEveFMDLoader.cxx:722
 AliEveFMDLoader.cxx:723
 AliEveFMDLoader.cxx:724
 AliEveFMDLoader.cxx:725
 AliEveFMDLoader.cxx:726
 AliEveFMDLoader.cxx:727
 AliEveFMDLoader.cxx:728
 AliEveFMDLoader.cxx:729
 AliEveFMDLoader.cxx:730
 AliEveFMDLoader.cxx:731
 AliEveFMDLoader.cxx:732
 AliEveFMDLoader.cxx:733
 AliEveFMDLoader.cxx:734
 AliEveFMDLoader.cxx:735
 AliEveFMDLoader.cxx:736
 AliEveFMDLoader.cxx:737
 AliEveFMDLoader.cxx:738
 AliEveFMDLoader.cxx:739
 AliEveFMDLoader.cxx:740
 AliEveFMDLoader.cxx:741