ROOT logo
//____________________________________________________________________
//
// This is a class that constructs AliFMDRecPoint objects from of Digits
// This class reads either digits from a TClonesArray or raw data from 
// a DDL file (or similar), and stores the read ADC counts in an
// internal cache (fAdcs).   The rec-points are made via the naiive
// method. 
//
//-- Authors: Evgeny Karpechev(INR) and Alla Maevsksia
//  Latest changes by Christian Holm Christensen <cholm@nbi.dk>
//
//
//____________________________________________________________________
/**************************************************************************
 * Copyright(c) 1998-1999, 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.                  *
 **************************************************************************/
/* $Id$ */
/** 
 * @file    AliFMDReconstructor.cxx
 * @author  Christian Holm Christensen <cholm@nbi.dk>
 * @date    Mon Mar 27 12:47:09 2006
 * @brief   FMD reconstruction 
*/

// #include <AliLog.h>                        // ALILOG_H
// #include <AliRun.h>                        // ALIRUN_H
#include "AliFMDDebug.h"
#include "AliFMDGeometry.h"                // ALIFMDGEOMETRY_H
#include "AliFMDParameters.h"              // ALIFMDPARAMETERS_H
#include "AliFMDAltroMapping.h"            // ALIFMDALTROMAPPING_H
#include "AliFMDDigit.h"                   // ALIFMDDIGIT_H
#include "AliFMDSDigit.h"                  // ALIFMDDIGIT_H
#include "AliFMDReconstructor.h"           // ALIFMDRECONSTRUCTOR_H
#include "AliFMDRecoParam.h"               // ALIFMDRECOPARAM_H
#include "AliFMDRawReader.h"               // ALIFMDRAWREADER_H
#include "AliFMDRecPoint.h"	   	   // ALIFMDMULTNAIIVE_H
#include "AliESDEvent.h"		   // ALIESDEVENT_H
#include "AliESDVertex.h"		   // ALIESDVERTEX_H
#include "AliESDTZERO.h"		   // ALIESDVERTEX_H
#include <AliESDFMD.h>			   // ALIESDFMD_H
#include <TMath.h>
#include <TH1.h>
#include <TH2.h>
#include <TFile.h>
#include <climits>
#include "AliFMDESDRevertexer.h"


class AliRawReader;

//____________________________________________________________________
ClassImp(AliFMDReconstructor)
#if 0
  ; // This is here to keep Emacs for indenting the next line
#endif

//____________________________________________________________________
AliFMDReconstructor::AliFMDReconstructor() 
  : AliReconstructor(),
    fMult(0x0), 
    fNMult(0),
    fTreeR(0x0),
    fCurrentVertex(0),
    fESDObj(0x0),
    fNoiseFactor(0),
    fAngleCorrect(kTRUE),
    fVertexType(kNoVertex),
    fESD(0x0),
    fDiagnostics(kFALSE),
    fDiagStep1(0), 
    fDiagStep2(0),
    fDiagStep3(0),
    fDiagStep4(0),
    fDiagAll(0),
    fBad(0), 
    fZombie(false)
{
  // Make a new FMD reconstructor object - default CTOR.  
  SetNoiseFactor();
  SetAngleCorrect();
  if (AliDebugLevel() > 0) fDiagnostics = kTRUE;
  for(Int_t det = 1; det<=3; det++) {
    fZS[det-1]       = kFALSE;
    fZSFactor[det-1] = 0;
  }
}

//____________________________________________________________________
AliFMDReconstructor::~AliFMDReconstructor() 
{
  // Destructor 
  if (fMult)   fMult->Delete();
  if (fMult)   delete fMult;
  if (fESDObj) delete fESDObj;
}

//____________________________________________________________________
void 
AliFMDReconstructor::Init() 
{
  // Initialize the reconstructor 

  // Initialize the geometry 
  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  geom->Init();
  geom->InitTransformations();

  // Initialize the parameters
  AliFMDParameters* param = AliFMDParameters::Instance();
  if (param->Init(true) != 0) {
    AliError("Failed to initialize parameters, making zombie");
    fZombie = true;
  }
  else 
    fZombie = false;
  
  // Current vertex position
  fCurrentVertex = 0;
  // Create array of reconstructed strip multiplicities 
  // fMult = new TClonesArray("AliFMDRecPoint", 51200);
  // Create ESD output object 
  fESDObj = new AliESDFMD;
  
  // Check if we need diagnostics histograms 
  if (!fDiagnostics) return;
  AliInfo("Making diagnostics histograms");
  if (!fDiagStep1) {
    fDiagStep1   = new TH2I("diagStep1", "Read ADC vs. Noise surpressed ADC",
			    1024, -.5, 1023.5, 1024, -.5, 1023.5);
    fDiagStep1->SetDirectory(0);
    fDiagStep1->GetXaxis()->SetTitle("ADC (read)");
    fDiagStep1->GetYaxis()->SetTitle(Form("ADC (noise surpressed %4.f)", 
					  fNoiseFactor));
  }
  if (!fDiagStep2) {
    fDiagStep2  = new TH2F("diagStep2",  "ADC vs Edep deduced",
			   1024, -.5, 1023.5, 100, 0, 2);
    fDiagStep2->SetDirectory(0);
    fDiagStep2->GetXaxis()->SetTitle("ADC (noise surpressed)");
    fDiagStep2->GetYaxis()->SetTitle("#Delta E [GeV]");
  }
  if (!fDiagStep3) {
    fDiagStep3  = new TH2F("diagStep3",  "Edep vs Edep path corrected",
			   100, 0., 2., 100, 0., 2.);
    fDiagStep3->SetDirectory(0);
    fDiagStep3->GetXaxis()->SetTitle("#Delta E [GeV]");
    fDiagStep3->GetYaxis()->SetTitle("#Delta E/#Delta x #times #delta x [GeV]");
  }
  if (!fDiagStep4) {
    fDiagStep4  = new TH2F("diagStep4",  "Edep vs Multiplicity deduced", 
			   100, 0., 2., 100, -.1, 19.9);
    fDiagStep4->SetDirectory(0);
    fDiagStep4->GetXaxis()->SetTitle("#Delta E/#Delta x #times #delta x [GeV]");
    fDiagStep4->GetYaxis()->SetTitle("Multiplicity");
    fDiagAll    = new TH2F("diagAll",    "Read ADC vs Multiplicity deduced", 
			   1024, -.5, 1023.5, 100, -.1, 19.9);
  }
  if (fDiagAll) {
    fDiagAll->SetDirectory(0);
    fDiagAll->GetXaxis()->SetTitle("ADC (read)");
    fDiagAll->GetYaxis()->SetTitle("Multiplicity");
  }
}

//____________________________________________________________________
void 
AliFMDReconstructor::ConvertDigits(AliRawReader* reader, 
				   TTree* digitsTree) const
{
  // Convert Raw digits to AliFMDDigit's in a tree 
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return;
  }
  AliFMDDebug(1, ("Reading raw data into digits tree"));
  if (!digitsTree) { 
    AliError("No digits tree passed");
    return;
  }
  static TClonesArray* array = 0;
  if (!array) array = new TClonesArray("AliFMDDigit");
  digitsTree->Branch("FMD", &array);
  array->Clear();
  
  AliFMDRawReader rawRead(reader, digitsTree);
  // rawRead.SetSampleRate(fFMD->GetSampleRate());
  // rawRead.Exec();
  rawRead.ReadAdcs(array);

  Int_t nWrite = digitsTree->Fill();
  AliDebugF(1, "Got a grand total of %d digits, wrote %d bytes to tree", 
	    array->GetEntriesFast(), nWrite);

  
  AliFMDAltroMapping* map = AliFMDParameters::Instance()->GetAltroMap();
  for (UShort_t i = 1; i <= 3; i++) { 
    fZS[i-1]       = rawRead.IsZeroSuppressed(map->Detector2DDL(i));
    fZSFactor[i-1] = rawRead.NoiseFactor(map->Detector2DDL(i));
    AliDebugF(2, "Noise factor for FMD%hu: %d", i, fZSFactor[i-1]);
  }
}

//____________________________________________________________________
void 
AliFMDReconstructor::GetVertex(AliESDEvent* esd) const
{
  // Return the vertex to use. 
  // This is obtained from the ESD object. 
  // If not found, a warning is issued.
  fVertexType    = kNoVertex;
  fCurrentVertex = 0;
  if (!esd) return;
  
  const AliESDVertex* vertex = esd->GetPrimaryVertex();
  if (!vertex)        vertex = esd->GetPrimaryVertexSPD();
  if (!vertex)        vertex = esd->GetPrimaryVertexTPC();
  if (!vertex)        vertex = esd->GetVertex();

  if (vertex) {
    AliFMDDebug(2, ("Got %s (%s) from ESD: %f", 
		    vertex->GetName(), vertex->GetTitle(), vertex->GetZ()));
    fCurrentVertex = vertex->GetZ();
    fVertexType    = kESDVertex;
    return;
  }
  else if (esd->GetESDTZERO()) { 
    AliFMDDebug(2, ("Got primary vertex from T0: %f", esd->GetT0zVertex()));
    fCurrentVertex = esd->GetT0zVertex();
    fVertexType    = kESDVertex;
    return;
  }
  AliWarning("Didn't get any vertex from ESD or generator");
}
  
//____________________________________________________________________
Int_t
AliFMDReconstructor::GetIdentifier() const
{
  // Get the detector identifier. 
  // Note the actual value is cached so that we do not 
  // need to do many expensive string comparisons. 
  static Int_t idx = AliReconstruction::GetDetIndex(GetDetectorName());
  return idx;
}

//____________________________________________________________________
const AliFMDRecoParam*
AliFMDReconstructor::GetParameters() const
{
  // Get the reconstruction parameters. 
  // 
  // Return: 
  //   Pointer to reconstruction parameters or null if not found or wrong type
  Int_t iDet = GetIdentifier(); // Was 12 - but changed on Cvetans request
  const AliDetectorRecoParam* params = AliReconstructor::GetRecoParam(iDet);
  if (!params || params->IsA() != AliFMDRecoParam::Class()) return 0;
  return static_cast<const AliFMDRecoParam*>(params);
}

//____________________________________________________________________
void 
AliFMDReconstructor::UseRecoParam(Bool_t set) const
{
  // 
  // Set-up reconstructor to use values from reconstruction
  // parameters, if present, for this event.   If the argument @a set
  // is @c false, then restore preset values. 
  // 
  // Parameters:
  //    set 
  //  
  static Float_t savedNoiseFactor  = fNoiseFactor;
  static Bool_t  savedAngleCorrect = fAngleCorrect;
  if (set) { 
    const AliFMDRecoParam* params  = GetParameters();
    if (params) { 
      fNoiseFactor  = params->NoiseFactor();
      fAngleCorrect = params->AngleCorrect();
    }
    return;
  }
  fNoiseFactor  = savedNoiseFactor;
  fAngleCorrect = savedAngleCorrect;
}
  
  
//____________________________________________________________________
void 
AliFMDReconstructor::MarkDeadChannels(AliESDFMD* esd) const
{
  // Loop over all entries of the ESD and mark 
  // those that are dead as such 
  // - otherwise put in the zero signal. 
  AliFMDParameters* param = AliFMDParameters::Instance();

  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nR = (d == 1 ? 1 : 2);

    for (UShort_t q = 0; q < nR; q++) {
      Char_t   r  = (q == 0 ? 'I' : 'O');
      UShort_t nS = (q == 0 ?  20 :  40);
      UShort_t nT = (q == 0 ? 512 : 256);

      for (UShort_t s = 0; s < nS; s++) { 
	for (UShort_t t = 0; t < nT; t++) {
	  // A strip can be marked `bad' for two reasons: 
	  // 
	  // - The raw reader fails to read the value 
	  // - The strip is marked in OCDB as bad (IsDead) 
	  // 
	  // Hence, a dead strip will always be marked kInvalid here, 
	  // while a non-dead bad-read strip will be filled with 0. 
	  if (fBad(d, r, s, t)) { 
	    AliDebugF(5, "Marking FMD%d%c[%2d,%3d] as bad", d, r, s, t);
	    esd->SetMultiplicity(d, r, s, t, AliESDFMD::kInvalidMult);
	  }	    
	  if (param->IsDead(d, r, s, t)) { 
	    AliDebugF(5, "Marking FMD%d%c[%2d,%3d] as dead", d, r, s, t);
	    esd->SetMultiplicity(d, r, s, t, AliESDFMD::kInvalidMult);
	    // esd->SetEta(d, r, s, t, AliESDFMD::kInvalidEta);
	  }
	  else if (esd->Multiplicity(d, r, s, t) == AliESDFMD::kInvalidMult) {
	    AliDebugF(20, "Setting null signal in FMD%d%c[%2d,%3d]", 
		      d, r, s, t);
	    esd->SetMultiplicity(d, r, s, t, 0);
	  }
	  else {
	    AliDebugF(10, "Setting FMD%d%c[%2d,%3d]=%f",d,r,s,t,
		      esd->Multiplicity(d, r, s, t));
	  }
	}
      }
    }
  }
}

//____________________________________________________________________
Bool_t
AliFMDReconstructor::PreReconstruct() const
{
  AliFMDDebug(1, ("Before reoconstructing"));
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return false;
  }

  // Get our vertex
  GetVertex(fESD);

  // Reset bad flags 
  fBad.Reset(false);

  // Reset the output ESD 
  if (fESDObj) {
    fESDObj->Clear();
    
    // Pre-set eta values 
    for (UShort_t d=1; d<=3; d++) { 
      UShort_t nQ = (d == 1 ? 1 : 2);
      for (UShort_t q=0; q<nQ; q++) { 
	UShort_t nStr = (q == 0 ? 512 : 256);
	Char_t   r    = (q == 0 ? 'I' : 'O');
	
	for (UShort_t t = 0; t < nStr; t++) { 
	  Float_t eta, phi;
	  // Always use sector 0
	  PhysicalCoordinates(d, r, 0, t, eta, phi);
	  fESDObj->SetEta(d, r, 0, t, eta);
	}
      }
    }
  }


  return true;
}

//____________________________________________________________________
void 
AliFMDReconstructor::Reconstruct(AliFMDRawReader& rawReader) const
{
  // Reconstruct directly from raw data (no intermediate output on
  // digit tree or rec point tree).  
  // 
  // Parameters: 
  //   rawReader	FMD Raw event reader 
  AliFMDDebug(1, ("Reconstructing from FMD raw reader"));
  if (!PreReconstruct()) return;

  UShort_t det, sec, str, fac;
  Short_t  adc, oldDet = -1;
  Bool_t   zs;
  Char_t   rng;
 
  UseRecoParam(kTRUE);
  while (rawReader.NextSignal(det, rng, sec, str, adc, zs, fac)) { 
    if (det != oldDet) { 
      fZS[det-1]       = zs;
      fZSFactor[det-1] = fac;
      oldDet           = det;
    }
    ProcessSignal(det, rng, sec, str, adc);
  }
  UseRecoParam(kFALSE);

}

//____________________________________________________________________
void 
AliFMDReconstructor::Reconstruct(AliRawReader* reader, TTree*) const
{
  // Reconstruct directly from raw data (no intermediate output on
  // digit tree or rec point tree).  
  // 
  // Parameters: 
  //   reader	Raw event reader 
  //   ctree    Not used - 'cluster tree' to store rec-points in. 
  AliFMDDebug(1, ("Reconstructing from raw reader"));
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return;
  }
  AliFMDRawReader rawReader(reader, 0);
  Reconstruct(rawReader);
}

//____________________________________________________________________
void 
AliFMDReconstructor::Digitize(AliRawReader* reader, TClonesArray* sdigits) const
{
  // Reconstruct directly from raw data (no intermediate output on
  // digit tree or rec point tree).  
  // 
  // Parameters: 
  //   reader	Raw event reader 
  //   ctree    Not used. 
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return;
  }
  AliFMDRawReader rawReader(reader, 0);

  UShort_t det, sec, str, sam, rat, fac;
  Short_t  adc, oldDet = -1;
  Bool_t   zs;
  Char_t   rng;
    
  UseRecoParam(kTRUE);
  while (rawReader.NextSample(det, rng, sec, str, sam, rat, adc, zs, fac)) { 
    if (!rawReader.SelectSample(sam, rat)) continue;
    if (det != oldDet) { 
      fZS[det-1]       = zs;
      fZSFactor[det-1] = fac;
      oldDet           = det;
    }
    DigitizeSignal(sdigits, det, rng, sec, str, sam, adc);
  }
  UseRecoParam(kFALSE);
}

//____________________________________________________________________
void 
AliFMDReconstructor::Reconstruct(TTree* digitsTree, 
				 TTree* clusterTree) const 
{
  // Reconstruct event from digits in tree 
  // Get the FMD branch holding the digits. 
  // FIXME: The vertex may not be known yet, so we may have to move
  // some of this to FillESD. 
  // 
  // Parameters: 
  //   digitsTree	Pointer to a tree containing digits 
  //   clusterTree	Pointer to output tree 
  // 
  if (!PreReconstruct()) return;

  if (!fMult) fMult = new TClonesArray("AliFMDRecPoint");

  AliFMDDebug(1, ("Reconstructing from digits in a tree"));

  // Get the digitis array 
  static TClonesArray* digits      = new TClonesArray("AliFMDDigit");
  TBranch*             digitBranch = digitsTree->GetBranch("FMD");
  if (!digitBranch) {
    Error("Exec", "No digit branch for the FMD found");
    return;
  }
  digitBranch->SetAddress(&digits);

  if (digits)  digits->Clear();
  if (fMult)   fMult->Clear();

  // Create rec-point output branch 
  fNMult = 0;
  fTreeR = clusterTree;
  fTreeR->Branch("FMD", &fMult);
  
  AliDebug(5, "Getting entry 0 from digit branch");
  digitBranch->GetEntry(0);
  
  AliDebugF(5, "Processing %d digits", digits->GetEntriesFast());
  UseRecoParam(kTRUE);
  ProcessDigits(digits);
  UseRecoParam(kFALSE);

  Int_t written = clusterTree->Fill();
  AliFMDDebug(10, ("Filled %d bytes into cluster tree", written));
  // digits->Delete();
  // delete digits;
}
 

//____________________________________________________________________
void
AliFMDReconstructor::ProcessDigits(TClonesArray* digits, 
				   const AliFMDRawReader& rawRead) const
{
  // For each digit, find the pseudo rapdity, azimuthal angle, and
  // number of corrected ADC counts, and pass it on to the algorithms
  // used. 
  // 
  // Parameters: 
  //    digits	Array of digits
  // 
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return;
  }
  AliFMDAltroMapping* map = AliFMDParameters::Instance()->GetAltroMap();
  for (size_t i = 1; i <= 3; i++) { 
    fZS[i-1]       = rawRead.IsZeroSuppressed(map->Detector2DDL(i));
    fZSFactor[i-1] = rawRead.NoiseFactor(map->Detector2DDL(i));
  }
  UseRecoParam(kTRUE);
  ProcessDigits(digits);
  UseRecoParam(kFALSE);
}

//____________________________________________________________________
void
AliFMDReconstructor::ProcessDigits(TClonesArray* digits) const
{
  // For each digit, find the pseudo rapdity, azimuthal angle, and
  // number of corrected ADC counts, and pass it on to the algorithms
  // used. 
  // 
  // Parameters: 
  //    digits	Array of digits
  // 
  Int_t nDigits = digits->GetEntries();
  AliFMDDebug(2, ("Got %d digits", nDigits));
  fESDObj->SetNoiseFactor(fNoiseFactor);
  fESDObj->SetAngleCorrected(fAngleCorrect);
  fBad.Reset(false);
  for (Int_t i = 0; i < nDigits; i++) {
    AliFMDDigit* digit = static_cast<AliFMDDigit*>(digits->At(i));
    if (!digit) continue;
    ProcessDigit(digit);
  }
}

//____________________________________________________________________
void
AliFMDReconstructor::ProcessDigit(AliFMDDigit* digit) const
{
  // 
  // Process a single digit 
  // 
  // Parameters:
  //    digit Digiti to process
  // 
  UShort_t det = digit->Detector();
  Char_t   rng = digit->Ring();
  UShort_t sec = digit->Sector();
  UShort_t str = digit->Strip();
  Short_t  adc = digit->Counts();
  // if (AliLog::GetDebugLevel("FMD","")>3) digit->Print();
  ProcessSignal(det, rng, sec, str, adc);
}

//____________________________________________________________________
void
AliFMDReconstructor::ProcessSignal(UShort_t det, 
				   Char_t   rng, 
				   UShort_t sec, 
				   UShort_t str, 
				   Short_t  adc) const
{
  // Process the signal from a single strip 
  // 
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    adc     ADC counts
  // 
  Int_t  dbg = AliLog::GetDebugLevel("FMD","");
  Bool_t dhr = dbg > 3 && dbg < 10;
  if (dhr) printf("FMD%d%c[%2d,%3d] adc=%4d ", det, rng, sec, str, adc);
  
  if (adc >= AliFMDRawReader::kBadSignal) { 
    AliFMDDebug(10, ("FMD%d%c[%2d,%3d] is marked bad", det, rng, sec, str));
    if (dhr) Printf("bad");
    fBad(det,rng,sec,str) = true;
    return;
  }

  // Check that the strip is not marked as dead 
  AliFMDParameters* param  = AliFMDParameters::Instance();
  if (param->IsDead(det, rng, sec, str)) {
    AliFMDDebug(10, ("FMD%d%c[%2d,%3d] is dead", det, rng, sec, str));
    if (dhr) Printf("dead");
    fBad(det,rng,sec,str) = true;
    return;
  }
  
  // digit->Print();
  // Get eta and phi 
  Float_t eta = fESDObj->Eta(det, rng, 0, str);
    
  // Substract pedestal. 
  UShort_t counts   = SubtractPedestal(det, rng, sec, str, adc);
  if(counts == USHRT_MAX)  { 
    if (dhr) Printf("invalid");
    return;
  }
  if (dhr) printf("counts=%4d ", counts);
  
    // Gain match digits. 
  Double_t edep     = Adc2Energy(det, rng, sec, str, eta, counts);
  // Get rid of nonsense energy
  if(edep < 0)  { 
    if (dhr) Printf("zero");
    return;
  }
  if (dhr) printf("edep=%f ", edep);
  
  // Make rough multiplicity 
  Double_t mult     = Energy2Multiplicity(det, rng, sec, str, edep);
  // Get rid of nonsense mult
  //if (mult > 20) { 
  //  AliWarning(Form("The mutliplicity in FMD%d%c[%2d,%3d]=%f > 20 "
  //		    "(ADC: %d, Energy: %f)", det, rng, sec, str, mult, 
  //		    counts, edep));
  // }
  if (mult < 0)  {
    if (dhr) Printf("not hit");
    return; 
  }

  if (dhr) Printf("mult=%f ", mult);
  AliFMDDebug(10, ("FMD%d%c[%2d,%3d]: "
		    "ADC: %d, Counts: %d, Energy: %f, Mult: %f",
		  det, rng, sec, str, adc, counts, edep, mult));
  
  // Create a `RecPoint' on the output branch. 
  if (fMult) {
    Float_t phi;
    PhysicalCoordinates(det, rng, sec, str, eta, phi);

    AliFMDRecPoint* m = 
      new ((*fMult)[fNMult]) AliFMDRecPoint(det, rng, sec, str, 
					    eta, phi, edep, mult);
    (void)m; // Suppress warnings about unused variables. 
    fNMult++;
  }
  
  fESDObj->SetMultiplicity(det, rng, sec, str, mult);
  // fESDObj->SetEta(det, rng, sec, str, eta);
  
  if (fDiagAll) fDiagAll->Fill(adc, mult);  

}

//____________________________________________________________________
void
AliFMDReconstructor::DigitizeSignal(TClonesArray* sdigits, 
				    UShort_t det, 
				    Char_t   rng, 
				    UShort_t sec, 
				    UShort_t str, 
				    UShort_t /* sam */,
				    Short_t  adc) const
{
  // Process the signal from a single strip 
  // 
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    adc     ADC counts
  // 
  AliFMDParameters* param  = AliFMDParameters::Instance();
  // Check that the strip is not marked as dead 
  if (param->IsDead(det, rng, sec, str)) {
    AliFMDDebug(10, ("FMD%d%c[%2d,%3d] is dead", det, rng, sec, str));
    return;
  }
  
  // Substract pedestal. 
  UShort_t counts   = SubtractPedestal(det, rng, sec, str, adc);
  if(counts == USHRT_MAX || counts == 0) return;
  
    // Gain match digits. 
  Double_t edep     = Adc2Energy(det, rng, sec, str, counts);
  // Get rid of nonsense energy
  if(edep < 0)  return;

  Int_t n = sdigits->GetEntriesFast();
  // AliFMDSDigit* sdigit = 
  new ((*sdigits)[n]) 
    AliFMDSDigit(det, rng, sec, str, edep, counts, counts, counts, counts);
  // sdigit->SetCount(sam, counts);
}

//____________________________________________________________________
UShort_t
AliFMDReconstructor::SubtractPedestal(UShort_t det, 
				      Char_t   rng, 
				      UShort_t sec, 
				      UShort_t str, 
				      UShort_t adc, 
				      Float_t  noiseFactor,
				      Bool_t   zsEnabled, 
				      UShort_t zsNoiseFactor) const
{
  // 
  // Subtract the pedestal off the ADC counts. 
  // 
  // Parameters:
  //    det           Detector number
  //    rng           Ring identifier
  //    sec           Sector number
  //    str           Strip number
  //    adc           ADC counts
  //    noiseFactor   If pedestal substracted pedestal is less then
  //        this times the noise, then consider this to be 0. 
  //    zsEnabled     Whether zero-suppression is on.
  //    zsNoiseFactor Noise factor used in on-line pedestal
  //        subtraction. 
  // 
  // Return:
  //    The pedestal subtracted ADC counts (possibly 0), or @c
  //         USHRT_MAX in case of problems.
  //  
  AliFMDParameters* param  = AliFMDParameters::Instance();
  Float_t           ped    = (zsEnabled ? 0 : 
			      param->GetPedestal(det, rng, sec, str));
  Float_t           noise  = param->GetPedestalWidth(det, rng, sec, str);
  if (ped < 0 || noise < 0) { 
    AliWarningClass(Form("Invalid pedestal (%f) or noise (%f) "
			 "for FMD%d%c[%02d,%03d]", 
		    ped, noise, det, rng, sec, str));
    return USHRT_MAX;
  }
  AliDebugClass(10, Form("Subtracting pedestal for FMD%d%c[%2d,%3d]=%4d "
			 "(%s w/factor %d, noise factor %f, "
			 "pedestal %8.2f+/-%8.2f)",
			 det, rng, sec, str, adc, 
			 (zsEnabled ? "zs'ed" : "straight"), 
			 zsNoiseFactor, noiseFactor, ped, noise));

  Int_t counts = adc + Int_t(zsEnabled ? zsNoiseFactor * noise : - ped);
  counts =  TMath::Max(Int_t(counts), 0);
  // Calculate the noise factor for suppressing remenants of the noise
  // peak.  If we have done on-line zero suppression, we only check
  // for noise signals that are larger than the suppressed noise.  If
  // the noise factor used on line is larger than the factor used
  // here, we do not do this check at all.  
  // 
  // For example:
  //    Online factor  |  Read factor |  Result 
  //    ---------------+--------------+-------------------------------
  //           2       |      3       | Check if signal > 1 * noise
  //           3       |      3       | Check if signal > 0
  //           3       |      2       | Check if signal > 0
  //
  // In this way, we make sure that we do not suppress away too much
  // data, and that the read-factor is the most stringent cut. 
  Float_t nf = zsNoiseFactor; // TMath::Max(0.F, noiseFactor - (zsEnabled ? zsNoiseFactor : 0));
  if (counts <= noise * nf) counts = 0;
  if (counts > 0) AliDebugClass(15, "Got a hit strip");

  UShort_t ret = counts < 0 ? 0 : counts;
  return ret;
}


//____________________________________________________________________
UShort_t
AliFMDReconstructor::SubtractPedestal(UShort_t det, 
				      Char_t   rng, 
				      UShort_t sec, 
				      UShort_t str, 
				      Short_t  adc) const
{
  // Member function to subtract the pedestal from a digit
  //
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    adc     # of ADC counts
  // Return:
  //    Pedestal subtracted signal or USHRT_MAX in case of problems 
  //
  UShort_t counts = SubtractPedestal(det, rng, sec, str, adc, 
				     fNoiseFactor, fZS[det-1], 
				     fZSFactor[det-1]);
  if (fDiagStep1) fDiagStep1->Fill(adc, counts);
  
  return counts;
}

//____________________________________________________________________
Float_t
AliFMDReconstructor::Adc2Energy(UShort_t det, 
				Char_t   rng, 
				UShort_t sec, 
				UShort_t str, 
				UShort_t count) const
{
  // Converts number of ADC counts to energy deposited. 
  // Note, that this member function can be overloaded by derived
  // classes to do strip-specific look-ups in databases or the like,
  // to find the proper gain for a strip. 
  // 
  // In the first simple version, we calculate the energy deposited as 
  // 
  //    EnergyDeposited = cos(theta) * gain * count
  // 
  // where 
  // 
  //           Pre_amp_MIP_Range
  //    gain = ----------------- * Energy_deposited_per_MIP
  //           ADC_channel_size    
  // 
  // is constant and the same for all strips.
  //
  // For the production we use the conversion measured in the NBI lab.
  // The total conversion is then:
  // 
  //    gain = ADC / DAC
  // 
  //                  EdepMip * count
  //      => energy = ----------------
  //                  gain * DACPerADC
  // 
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    counts  Number of ADC counts over pedestal
  // Return 
  //    The energy deposited in a single strip, or -1 in case of problems
  //
  if (count <= 0) return 0;
  AliFMDParameters* param = AliFMDParameters::Instance();
  Float_t           gain  = param->GetPulseGain(det, rng, sec, str);
  // 'Tagging' bad gains as bad energy
  if (gain < 0) { 
    AliDebugF(10, "Invalid gain (%f) for FMD%d%c[%02d,%03d]", 
		gain, det, rng, sec, str);
    return -1;
  }
  AliDebugF(10, "Converting counts %d to energy (factor=%f, DAC2MIP=%f)", 
	    count, gain,param->GetDACPerMIP());

  Double_t edep  = ((count * param->GetEdepMip()) 
		    / (gain * param->GetDACPerMIP()));
  return edep;
}

//____________________________________________________________________
Float_t
AliFMDReconstructor::Adc2Energy(UShort_t det, 
				Char_t   rng, 
				UShort_t sec, 
				UShort_t str, 
				Float_t  eta, 
				UShort_t count) const
{
  // Converts number of ADC counts to energy deposited. 
  // Note, that this member function can be overloaded by derived
  // classes to do strip-specific look-ups in databases or the like,
  // to find the proper gain for a strip. 
  // 
  // In the first simple version, we calculate the energy deposited as 
  // 
  //    EnergyDeposited = cos(theta) * gain * count
  // 
  // where 
  // 
  //           Pre_amp_MIP_Range
  //    gain = ----------------- * Energy_deposited_per_MIP
  //           ADC_channel_size    
  // 
  // is constant and the same for all strips.
  //
  // For the production we use the conversion measured in the NBI lab.
  // The total conversion is then:
  // 
  //    gain = ADC / DAC
  // 
  //                  EdepMip * count
  //      => energy = ----------------
  //                  gain * DACPerADC
  // 
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    eta     Psuedo-rapidity
  //    counts  Number of ADC counts over pedestal
  // Return 
  //    The energy deposited in a single strip, or -1 in case of problems
  //
  Double_t edep = Adc2Energy(det, rng, sec, str, count);
  
  if (fDiagStep2) fDiagStep2->Fill(count, edep);  
  if (fAngleCorrect) {
    Double_t theta = 2 * TMath::ATan(TMath::Exp(-eta));
    Double_t corr  = TMath::Abs(TMath::Cos(theta));
    Double_t cedep = corr * edep;
    AliDebugF(10, "correcting for path %f * %f = %f (eta=%f, theta=%f)",
	      edep, corr, cedep, eta, theta);
    if (fDiagStep3) fDiagStep3->Fill(edep, cedep);  
    edep = cedep;
  }
  return edep;
}

//____________________________________________________________________
Float_t
AliFMDReconstructor::Energy2Multiplicity(UShort_t /*det*/, 
					 Char_t   /*rng*/, 
					 UShort_t /*sec*/, 
					 UShort_t /*str*/, 
					 Float_t  edep) const
{
  // Converts an energy signal to number of particles. 
  // Note, that this member function can be overloaded by derived
  // classes to do strip-specific look-ups in databases or the like,
  // to find the proper gain for a strip. 
  // 
  // In this simple version, we calculate the multiplicity as 
  // 
  //   multiplicity = Energy_deposited / Energy_deposited_per_MIP
  // 
  // where 
  //
  //   Energy_deposited_per_MIP = 1.664 * SI_density * SI_thickness 
  // 
  // is constant and the same for all strips 
  //
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    edep    Energy deposited in a single strip
  // Return 
  //    The "bare" multiplicity corresponding to the energy deposited
  AliFMDParameters* param   = AliFMDParameters::Instance();
  Double_t          edepMIP = param->GetEdepMip();
  Float_t           mult    = edep / edepMIP;
#if 0
  if (edep > 0) 
    AliFMDDebug(15, ("Translating energy %f to multiplicity via "
		     "divider %f->%f", edep, edepMIP, mult));
#endif
  if (fDiagStep4) fDiagStep4->Fill(edep, mult);  
  return mult;
}

//____________________________________________________________________
void
AliFMDReconstructor::PhysicalCoordinates(UShort_t det, 
					 Char_t   rng, 
					 UShort_t sec, 
					 UShort_t str, 
					 Float_t& eta, 
					 Float_t& phi) const
{
  // Get the eta and phi of a digit 
  // 
  // Parameters: 
  //    det	Detector ID
  //    rng	Ring ID
  //    sec	Sector ID
  //    rng	Strip ID
  //    eta	On return, contains the psuedo-rapidity of the strip
  //    phi     On return, contains the azimuthal angle of the strip
  // 
  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  Double_t x, y, z, r, theta, deta, dphi;
  geom->Detector2XYZ(det, rng, sec, str, x, y, z);

  // Correct for vertex offset. 
  z     -= fCurrentVertex;
  AliFMDGeometry::XYZ2REtaPhiTheta(x, y, z, r, deta, dphi, theta);
  eta = deta;
  phi = dphi;
}

namespace { 
  class ESDPrinter : public AliESDFMD::ForOne
  {
  public:
    ESDPrinter() {}
    Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
		      Float_t m, Float_t e)
    {
      if (m > 0 && m != AliESDFMD::kInvalidMult) 
	printf("  FMD%d%c[%2d,%3d] = %6.3f / %6.3f\n", d, r, s, t, m, e);
      return kTRUE;
    }
  };
}


//____________________________________________________________________
void 
AliFMDReconstructor::FillESD(TTree*  /* digitsTree */, 
			     TTree*  /* clusterTree */,
			     AliESDEvent* esd) const
{
  // nothing to be done
  // FIXME: The vertex may not be known when Reconstruct is executed,
  // so we may have to move some of that member function here. 
  AliFMDDebug(2, ("Calling FillESD with two trees and one ESD"));
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return;
  }
  // fESDObj->Print();

  // Fix up ESD so that only truely dead channels get the kInvalidMult flag. 
  MarkDeadChannels(fESDObj);

  Double_t oldVz = fCurrentVertex;
  GetVertex(esd);
  if (fVertexType != kNoVertex) { 
    AliFMDDebug(2, ("Revertexing the ESD data to vz=%f (was %f)",
		    fCurrentVertex, oldVz));
    AliFMDESDRevertexer revertexer;
    revertexer.Revertex(fESDObj, fCurrentVertex);
  }
  
  if (AliDebugLevel() > 10) { 
    ESDPrinter p;
    fESDObj->ForEach(p);
  }

  if (esd) { 
    AliFMDDebug(2, ("Writing FMD data to ESD tree"));
    esd->SetFMDData(fESDObj);
  }

  if (!fDiagnostics || !esd) return;
  static bool first = true;
  // This is most likely NOT the event number you'd like to use. It
  // has nothing to do with the 'real' event number. 
  // - That's OK.  We just use it for the name of the directory -
  // nothing else.  Christian
  Int_t evno = esd->GetEventNumberInFile(); 
  AliFMDDebug(3, ("Writing diagnostics histograms to FMD.Diag.root/%03d",evno));
  TFile f("FMD.Diag.root", (first ? "RECREATE" : "UPDATE"));
  first = false;
  f.cd(); 
  TDirectory* d = f.mkdir(Form("%03d", evno), 
			  Form("Diagnostics histograms for event # %d", evno));
  d->cd();
  if (fDiagStep1) fDiagStep1->Write();
  if (fDiagStep2) fDiagStep2->Write();
  if (fDiagStep3) fDiagStep3->Write();
  if (fDiagStep4) fDiagStep4->Write();
  if (fDiagAll)   fDiagAll->Write();
  d->Write();
  f.Write();
  f.Close();

  if (fDiagStep1) fDiagStep1->Reset();
  if (fDiagStep2) fDiagStep2->Reset();
  if (fDiagStep3) fDiagStep3->Reset();
  if (fDiagStep4) fDiagStep4->Reset();
  if (fDiagAll)   fDiagAll->Reset();
}

//____________________________________________________________________
void
AliFMDReconstructor::FillESD(AliRawReader*, TTree* clusterTree, 
			     AliESDEvent* esd) const
{
  // 
  // Forwards to above member function 
  //
  if (fZombie) { 
    AliWarning("I'm a zombie - cannot do anything");
    return;
  }
  TTree* dummy = 0;
  FillESD(dummy, clusterTree, esd);
}
//____________________________________________________________________
//
// EOF
//
 AliFMDReconstructor.cxx:1
 AliFMDReconstructor.cxx:2
 AliFMDReconstructor.cxx:3
 AliFMDReconstructor.cxx:4
 AliFMDReconstructor.cxx:5
 AliFMDReconstructor.cxx:6
 AliFMDReconstructor.cxx:7
 AliFMDReconstructor.cxx:8
 AliFMDReconstructor.cxx:9
 AliFMDReconstructor.cxx:10
 AliFMDReconstructor.cxx:11
 AliFMDReconstructor.cxx:12
 AliFMDReconstructor.cxx:13
 AliFMDReconstructor.cxx:14
 AliFMDReconstructor.cxx:15
 AliFMDReconstructor.cxx:16
 AliFMDReconstructor.cxx:17
 AliFMDReconstructor.cxx:18
 AliFMDReconstructor.cxx:19
 AliFMDReconstructor.cxx:20
 AliFMDReconstructor.cxx:21
 AliFMDReconstructor.cxx:22
 AliFMDReconstructor.cxx:23
 AliFMDReconstructor.cxx:24
 AliFMDReconstructor.cxx:25
 AliFMDReconstructor.cxx:26
 AliFMDReconstructor.cxx:27
 AliFMDReconstructor.cxx:28
 AliFMDReconstructor.cxx:29
 AliFMDReconstructor.cxx:30
 AliFMDReconstructor.cxx:31
 AliFMDReconstructor.cxx:32
 AliFMDReconstructor.cxx:33
 AliFMDReconstructor.cxx:34
 AliFMDReconstructor.cxx:35
 AliFMDReconstructor.cxx:36
 AliFMDReconstructor.cxx:37
 AliFMDReconstructor.cxx:38
 AliFMDReconstructor.cxx:39
 AliFMDReconstructor.cxx:40
 AliFMDReconstructor.cxx:41
 AliFMDReconstructor.cxx:42
 AliFMDReconstructor.cxx:43
 AliFMDReconstructor.cxx:44
 AliFMDReconstructor.cxx:45
 AliFMDReconstructor.cxx:46
 AliFMDReconstructor.cxx:47
 AliFMDReconstructor.cxx:48
 AliFMDReconstructor.cxx:49
 AliFMDReconstructor.cxx:50
 AliFMDReconstructor.cxx:51
 AliFMDReconstructor.cxx:52
 AliFMDReconstructor.cxx:53
 AliFMDReconstructor.cxx:54
 AliFMDReconstructor.cxx:55
 AliFMDReconstructor.cxx:56
 AliFMDReconstructor.cxx:57
 AliFMDReconstructor.cxx:58
 AliFMDReconstructor.cxx:59
 AliFMDReconstructor.cxx:60
 AliFMDReconstructor.cxx:61
 AliFMDReconstructor.cxx:62
 AliFMDReconstructor.cxx:63
 AliFMDReconstructor.cxx:64
 AliFMDReconstructor.cxx:65
 AliFMDReconstructor.cxx:66
 AliFMDReconstructor.cxx:67
 AliFMDReconstructor.cxx:68
 AliFMDReconstructor.cxx:69
 AliFMDReconstructor.cxx:70
 AliFMDReconstructor.cxx:71
 AliFMDReconstructor.cxx:72
 AliFMDReconstructor.cxx:73
 AliFMDReconstructor.cxx:74
 AliFMDReconstructor.cxx:75
 AliFMDReconstructor.cxx:76
 AliFMDReconstructor.cxx:77
 AliFMDReconstructor.cxx:78
 AliFMDReconstructor.cxx:79
 AliFMDReconstructor.cxx:80
 AliFMDReconstructor.cxx:81
 AliFMDReconstructor.cxx:82
 AliFMDReconstructor.cxx:83
 AliFMDReconstructor.cxx:84
 AliFMDReconstructor.cxx:85
 AliFMDReconstructor.cxx:86
 AliFMDReconstructor.cxx:87
 AliFMDReconstructor.cxx:88
 AliFMDReconstructor.cxx:89
 AliFMDReconstructor.cxx:90
 AliFMDReconstructor.cxx:91
 AliFMDReconstructor.cxx:92
 AliFMDReconstructor.cxx:93
 AliFMDReconstructor.cxx:94
 AliFMDReconstructor.cxx:95
 AliFMDReconstructor.cxx:96
 AliFMDReconstructor.cxx:97
 AliFMDReconstructor.cxx:98
 AliFMDReconstructor.cxx:99
 AliFMDReconstructor.cxx:100
 AliFMDReconstructor.cxx:101
 AliFMDReconstructor.cxx:102
 AliFMDReconstructor.cxx:103
 AliFMDReconstructor.cxx:104
 AliFMDReconstructor.cxx:105
 AliFMDReconstructor.cxx:106
 AliFMDReconstructor.cxx:107
 AliFMDReconstructor.cxx:108
 AliFMDReconstructor.cxx:109
 AliFMDReconstructor.cxx:110
 AliFMDReconstructor.cxx:111
 AliFMDReconstructor.cxx:112
 AliFMDReconstructor.cxx:113
 AliFMDReconstructor.cxx:114
 AliFMDReconstructor.cxx:115
 AliFMDReconstructor.cxx:116
 AliFMDReconstructor.cxx:117
 AliFMDReconstructor.cxx:118
 AliFMDReconstructor.cxx:119
 AliFMDReconstructor.cxx:120
 AliFMDReconstructor.cxx:121
 AliFMDReconstructor.cxx:122
 AliFMDReconstructor.cxx:123
 AliFMDReconstructor.cxx:124
 AliFMDReconstructor.cxx:125
 AliFMDReconstructor.cxx:126
 AliFMDReconstructor.cxx:127
 AliFMDReconstructor.cxx:128
 AliFMDReconstructor.cxx:129
 AliFMDReconstructor.cxx:130
 AliFMDReconstructor.cxx:131
 AliFMDReconstructor.cxx:132
 AliFMDReconstructor.cxx:133
 AliFMDReconstructor.cxx:134
 AliFMDReconstructor.cxx:135
 AliFMDReconstructor.cxx:136
 AliFMDReconstructor.cxx:137
 AliFMDReconstructor.cxx:138
 AliFMDReconstructor.cxx:139
 AliFMDReconstructor.cxx:140
 AliFMDReconstructor.cxx:141
 AliFMDReconstructor.cxx:142
 AliFMDReconstructor.cxx:143
 AliFMDReconstructor.cxx:144
 AliFMDReconstructor.cxx:145
 AliFMDReconstructor.cxx:146
 AliFMDReconstructor.cxx:147
 AliFMDReconstructor.cxx:148
 AliFMDReconstructor.cxx:149
 AliFMDReconstructor.cxx:150
 AliFMDReconstructor.cxx:151
 AliFMDReconstructor.cxx:152
 AliFMDReconstructor.cxx:153
 AliFMDReconstructor.cxx:154
 AliFMDReconstructor.cxx:155
 AliFMDReconstructor.cxx:156
 AliFMDReconstructor.cxx:157
 AliFMDReconstructor.cxx:158
 AliFMDReconstructor.cxx:159
 AliFMDReconstructor.cxx:160
 AliFMDReconstructor.cxx:161
 AliFMDReconstructor.cxx:162
 AliFMDReconstructor.cxx:163
 AliFMDReconstructor.cxx:164
 AliFMDReconstructor.cxx:165
 AliFMDReconstructor.cxx:166
 AliFMDReconstructor.cxx:167
 AliFMDReconstructor.cxx:168
 AliFMDReconstructor.cxx:169
 AliFMDReconstructor.cxx:170
 AliFMDReconstructor.cxx:171
 AliFMDReconstructor.cxx:172
 AliFMDReconstructor.cxx:173
 AliFMDReconstructor.cxx:174
 AliFMDReconstructor.cxx:175
 AliFMDReconstructor.cxx:176
 AliFMDReconstructor.cxx:177
 AliFMDReconstructor.cxx:178
 AliFMDReconstructor.cxx:179
 AliFMDReconstructor.cxx:180
 AliFMDReconstructor.cxx:181
 AliFMDReconstructor.cxx:182
 AliFMDReconstructor.cxx:183
 AliFMDReconstructor.cxx:184
 AliFMDReconstructor.cxx:185
 AliFMDReconstructor.cxx:186
 AliFMDReconstructor.cxx:187
 AliFMDReconstructor.cxx:188
 AliFMDReconstructor.cxx:189
 AliFMDReconstructor.cxx:190
 AliFMDReconstructor.cxx:191
 AliFMDReconstructor.cxx:192
 AliFMDReconstructor.cxx:193
 AliFMDReconstructor.cxx:194
 AliFMDReconstructor.cxx:195
 AliFMDReconstructor.cxx:196
 AliFMDReconstructor.cxx:197
 AliFMDReconstructor.cxx:198
 AliFMDReconstructor.cxx:199
 AliFMDReconstructor.cxx:200
 AliFMDReconstructor.cxx:201
 AliFMDReconstructor.cxx:202
 AliFMDReconstructor.cxx:203
 AliFMDReconstructor.cxx:204
 AliFMDReconstructor.cxx:205
 AliFMDReconstructor.cxx:206
 AliFMDReconstructor.cxx:207
 AliFMDReconstructor.cxx:208
 AliFMDReconstructor.cxx:209
 AliFMDReconstructor.cxx:210
 AliFMDReconstructor.cxx:211
 AliFMDReconstructor.cxx:212
 AliFMDReconstructor.cxx:213
 AliFMDReconstructor.cxx:214
 AliFMDReconstructor.cxx:215
 AliFMDReconstructor.cxx:216
 AliFMDReconstructor.cxx:217
 AliFMDReconstructor.cxx:218
 AliFMDReconstructor.cxx:219
 AliFMDReconstructor.cxx:220
 AliFMDReconstructor.cxx:221
 AliFMDReconstructor.cxx:222
 AliFMDReconstructor.cxx:223
 AliFMDReconstructor.cxx:224
 AliFMDReconstructor.cxx:225
 AliFMDReconstructor.cxx:226
 AliFMDReconstructor.cxx:227
 AliFMDReconstructor.cxx:228
 AliFMDReconstructor.cxx:229
 AliFMDReconstructor.cxx:230
 AliFMDReconstructor.cxx:231
 AliFMDReconstructor.cxx:232
 AliFMDReconstructor.cxx:233
 AliFMDReconstructor.cxx:234
 AliFMDReconstructor.cxx:235
 AliFMDReconstructor.cxx:236
 AliFMDReconstructor.cxx:237
 AliFMDReconstructor.cxx:238
 AliFMDReconstructor.cxx:239
 AliFMDReconstructor.cxx:240
 AliFMDReconstructor.cxx:241
 AliFMDReconstructor.cxx:242
 AliFMDReconstructor.cxx:243
 AliFMDReconstructor.cxx:244
 AliFMDReconstructor.cxx:245
 AliFMDReconstructor.cxx:246
 AliFMDReconstructor.cxx:247
 AliFMDReconstructor.cxx:248
 AliFMDReconstructor.cxx:249
 AliFMDReconstructor.cxx:250
 AliFMDReconstructor.cxx:251
 AliFMDReconstructor.cxx:252
 AliFMDReconstructor.cxx:253
 AliFMDReconstructor.cxx:254
 AliFMDReconstructor.cxx:255
 AliFMDReconstructor.cxx:256
 AliFMDReconstructor.cxx:257
 AliFMDReconstructor.cxx:258
 AliFMDReconstructor.cxx:259
 AliFMDReconstructor.cxx:260
 AliFMDReconstructor.cxx:261
 AliFMDReconstructor.cxx:262
 AliFMDReconstructor.cxx:263
 AliFMDReconstructor.cxx:264
 AliFMDReconstructor.cxx:265
 AliFMDReconstructor.cxx:266
 AliFMDReconstructor.cxx:267
 AliFMDReconstructor.cxx:268
 AliFMDReconstructor.cxx:269
 AliFMDReconstructor.cxx:270
 AliFMDReconstructor.cxx:271
 AliFMDReconstructor.cxx:272
 AliFMDReconstructor.cxx:273
 AliFMDReconstructor.cxx:274
 AliFMDReconstructor.cxx:275
 AliFMDReconstructor.cxx:276
 AliFMDReconstructor.cxx:277
 AliFMDReconstructor.cxx:278
 AliFMDReconstructor.cxx:279
 AliFMDReconstructor.cxx:280
 AliFMDReconstructor.cxx:281
 AliFMDReconstructor.cxx:282
 AliFMDReconstructor.cxx:283
 AliFMDReconstructor.cxx:284
 AliFMDReconstructor.cxx:285
 AliFMDReconstructor.cxx:286
 AliFMDReconstructor.cxx:287
 AliFMDReconstructor.cxx:288
 AliFMDReconstructor.cxx:289
 AliFMDReconstructor.cxx:290
 AliFMDReconstructor.cxx:291
 AliFMDReconstructor.cxx:292
 AliFMDReconstructor.cxx:293
 AliFMDReconstructor.cxx:294
 AliFMDReconstructor.cxx:295
 AliFMDReconstructor.cxx:296
 AliFMDReconstructor.cxx:297
 AliFMDReconstructor.cxx:298
 AliFMDReconstructor.cxx:299
 AliFMDReconstructor.cxx:300
 AliFMDReconstructor.cxx:301
 AliFMDReconstructor.cxx:302
 AliFMDReconstructor.cxx:303
 AliFMDReconstructor.cxx:304
 AliFMDReconstructor.cxx:305
 AliFMDReconstructor.cxx:306
 AliFMDReconstructor.cxx:307
 AliFMDReconstructor.cxx:308
 AliFMDReconstructor.cxx:309
 AliFMDReconstructor.cxx:310
 AliFMDReconstructor.cxx:311
 AliFMDReconstructor.cxx:312
 AliFMDReconstructor.cxx:313
 AliFMDReconstructor.cxx:314
 AliFMDReconstructor.cxx:315
 AliFMDReconstructor.cxx:316
 AliFMDReconstructor.cxx:317
 AliFMDReconstructor.cxx:318
 AliFMDReconstructor.cxx:319
 AliFMDReconstructor.cxx:320
 AliFMDReconstructor.cxx:321
 AliFMDReconstructor.cxx:322
 AliFMDReconstructor.cxx:323
 AliFMDReconstructor.cxx:324
 AliFMDReconstructor.cxx:325
 AliFMDReconstructor.cxx:326
 AliFMDReconstructor.cxx:327
 AliFMDReconstructor.cxx:328
 AliFMDReconstructor.cxx:329
 AliFMDReconstructor.cxx:330
 AliFMDReconstructor.cxx:331
 AliFMDReconstructor.cxx:332
 AliFMDReconstructor.cxx:333
 AliFMDReconstructor.cxx:334
 AliFMDReconstructor.cxx:335
 AliFMDReconstructor.cxx:336
 AliFMDReconstructor.cxx:337
 AliFMDReconstructor.cxx:338
 AliFMDReconstructor.cxx:339
 AliFMDReconstructor.cxx:340
 AliFMDReconstructor.cxx:341
 AliFMDReconstructor.cxx:342
 AliFMDReconstructor.cxx:343
 AliFMDReconstructor.cxx:344
 AliFMDReconstructor.cxx:345
 AliFMDReconstructor.cxx:346
 AliFMDReconstructor.cxx:347
 AliFMDReconstructor.cxx:348
 AliFMDReconstructor.cxx:349
 AliFMDReconstructor.cxx:350
 AliFMDReconstructor.cxx:351
 AliFMDReconstructor.cxx:352
 AliFMDReconstructor.cxx:353
 AliFMDReconstructor.cxx:354
 AliFMDReconstructor.cxx:355
 AliFMDReconstructor.cxx:356
 AliFMDReconstructor.cxx:357
 AliFMDReconstructor.cxx:358
 AliFMDReconstructor.cxx:359
 AliFMDReconstructor.cxx:360
 AliFMDReconstructor.cxx:361
 AliFMDReconstructor.cxx:362
 AliFMDReconstructor.cxx:363
 AliFMDReconstructor.cxx:364
 AliFMDReconstructor.cxx:365
 AliFMDReconstructor.cxx:366
 AliFMDReconstructor.cxx:367
 AliFMDReconstructor.cxx:368
 AliFMDReconstructor.cxx:369
 AliFMDReconstructor.cxx:370
 AliFMDReconstructor.cxx:371
 AliFMDReconstructor.cxx:372
 AliFMDReconstructor.cxx:373
 AliFMDReconstructor.cxx:374
 AliFMDReconstructor.cxx:375
 AliFMDReconstructor.cxx:376
 AliFMDReconstructor.cxx:377
 AliFMDReconstructor.cxx:378
 AliFMDReconstructor.cxx:379
 AliFMDReconstructor.cxx:380
 AliFMDReconstructor.cxx:381
 AliFMDReconstructor.cxx:382
 AliFMDReconstructor.cxx:383
 AliFMDReconstructor.cxx:384
 AliFMDReconstructor.cxx:385
 AliFMDReconstructor.cxx:386
 AliFMDReconstructor.cxx:387
 AliFMDReconstructor.cxx:388
 AliFMDReconstructor.cxx:389
 AliFMDReconstructor.cxx:390
 AliFMDReconstructor.cxx:391
 AliFMDReconstructor.cxx:392
 AliFMDReconstructor.cxx:393
 AliFMDReconstructor.cxx:394
 AliFMDReconstructor.cxx:395
 AliFMDReconstructor.cxx:396
 AliFMDReconstructor.cxx:397
 AliFMDReconstructor.cxx:398
 AliFMDReconstructor.cxx:399
 AliFMDReconstructor.cxx:400
 AliFMDReconstructor.cxx:401
 AliFMDReconstructor.cxx:402
 AliFMDReconstructor.cxx:403
 AliFMDReconstructor.cxx:404
 AliFMDReconstructor.cxx:405
 AliFMDReconstructor.cxx:406
 AliFMDReconstructor.cxx:407
 AliFMDReconstructor.cxx:408
 AliFMDReconstructor.cxx:409
 AliFMDReconstructor.cxx:410
 AliFMDReconstructor.cxx:411
 AliFMDReconstructor.cxx:412
 AliFMDReconstructor.cxx:413
 AliFMDReconstructor.cxx:414
 AliFMDReconstructor.cxx:415
 AliFMDReconstructor.cxx:416
 AliFMDReconstructor.cxx:417
 AliFMDReconstructor.cxx:418
 AliFMDReconstructor.cxx:419
 AliFMDReconstructor.cxx:420
 AliFMDReconstructor.cxx:421
 AliFMDReconstructor.cxx:422
 AliFMDReconstructor.cxx:423
 AliFMDReconstructor.cxx:424
 AliFMDReconstructor.cxx:425
 AliFMDReconstructor.cxx:426
 AliFMDReconstructor.cxx:427
 AliFMDReconstructor.cxx:428
 AliFMDReconstructor.cxx:429
 AliFMDReconstructor.cxx:430
 AliFMDReconstructor.cxx:431
 AliFMDReconstructor.cxx:432
 AliFMDReconstructor.cxx:433
 AliFMDReconstructor.cxx:434
 AliFMDReconstructor.cxx:435
 AliFMDReconstructor.cxx:436
 AliFMDReconstructor.cxx:437
 AliFMDReconstructor.cxx:438
 AliFMDReconstructor.cxx:439
 AliFMDReconstructor.cxx:440
 AliFMDReconstructor.cxx:441
 AliFMDReconstructor.cxx:442
 AliFMDReconstructor.cxx:443
 AliFMDReconstructor.cxx:444
 AliFMDReconstructor.cxx:445
 AliFMDReconstructor.cxx:446
 AliFMDReconstructor.cxx:447
 AliFMDReconstructor.cxx:448
 AliFMDReconstructor.cxx:449
 AliFMDReconstructor.cxx:450
 AliFMDReconstructor.cxx:451
 AliFMDReconstructor.cxx:452
 AliFMDReconstructor.cxx:453
 AliFMDReconstructor.cxx:454
 AliFMDReconstructor.cxx:455
 AliFMDReconstructor.cxx:456
 AliFMDReconstructor.cxx:457
 AliFMDReconstructor.cxx:458
 AliFMDReconstructor.cxx:459
 AliFMDReconstructor.cxx:460
 AliFMDReconstructor.cxx:461
 AliFMDReconstructor.cxx:462
 AliFMDReconstructor.cxx:463
 AliFMDReconstructor.cxx:464
 AliFMDReconstructor.cxx:465
 AliFMDReconstructor.cxx:466
 AliFMDReconstructor.cxx:467
 AliFMDReconstructor.cxx:468
 AliFMDReconstructor.cxx:469
 AliFMDReconstructor.cxx:470
 AliFMDReconstructor.cxx:471
 AliFMDReconstructor.cxx:472
 AliFMDReconstructor.cxx:473
 AliFMDReconstructor.cxx:474
 AliFMDReconstructor.cxx:475
 AliFMDReconstructor.cxx:476
 AliFMDReconstructor.cxx:477
 AliFMDReconstructor.cxx:478
 AliFMDReconstructor.cxx:479
 AliFMDReconstructor.cxx:480
 AliFMDReconstructor.cxx:481
 AliFMDReconstructor.cxx:482
 AliFMDReconstructor.cxx:483
 AliFMDReconstructor.cxx:484
 AliFMDReconstructor.cxx:485
 AliFMDReconstructor.cxx:486
 AliFMDReconstructor.cxx:487
 AliFMDReconstructor.cxx:488
 AliFMDReconstructor.cxx:489
 AliFMDReconstructor.cxx:490
 AliFMDReconstructor.cxx:491
 AliFMDReconstructor.cxx:492
 AliFMDReconstructor.cxx:493
 AliFMDReconstructor.cxx:494
 AliFMDReconstructor.cxx:495
 AliFMDReconstructor.cxx:496
 AliFMDReconstructor.cxx:497
 AliFMDReconstructor.cxx:498
 AliFMDReconstructor.cxx:499
 AliFMDReconstructor.cxx:500
 AliFMDReconstructor.cxx:501
 AliFMDReconstructor.cxx:502
 AliFMDReconstructor.cxx:503
 AliFMDReconstructor.cxx:504
 AliFMDReconstructor.cxx:505
 AliFMDReconstructor.cxx:506
 AliFMDReconstructor.cxx:507
 AliFMDReconstructor.cxx:508
 AliFMDReconstructor.cxx:509
 AliFMDReconstructor.cxx:510
 AliFMDReconstructor.cxx:511
 AliFMDReconstructor.cxx:512
 AliFMDReconstructor.cxx:513
 AliFMDReconstructor.cxx:514
 AliFMDReconstructor.cxx:515
 AliFMDReconstructor.cxx:516
 AliFMDReconstructor.cxx:517
 AliFMDReconstructor.cxx:518
 AliFMDReconstructor.cxx:519
 AliFMDReconstructor.cxx:520
 AliFMDReconstructor.cxx:521
 AliFMDReconstructor.cxx:522
 AliFMDReconstructor.cxx:523
 AliFMDReconstructor.cxx:524
 AliFMDReconstructor.cxx:525
 AliFMDReconstructor.cxx:526
 AliFMDReconstructor.cxx:527
 AliFMDReconstructor.cxx:528
 AliFMDReconstructor.cxx:529
 AliFMDReconstructor.cxx:530
 AliFMDReconstructor.cxx:531
 AliFMDReconstructor.cxx:532
 AliFMDReconstructor.cxx:533
 AliFMDReconstructor.cxx:534
 AliFMDReconstructor.cxx:535
 AliFMDReconstructor.cxx:536
 AliFMDReconstructor.cxx:537
 AliFMDReconstructor.cxx:538
 AliFMDReconstructor.cxx:539
 AliFMDReconstructor.cxx:540
 AliFMDReconstructor.cxx:541
 AliFMDReconstructor.cxx:542
 AliFMDReconstructor.cxx:543
 AliFMDReconstructor.cxx:544
 AliFMDReconstructor.cxx:545
 AliFMDReconstructor.cxx:546
 AliFMDReconstructor.cxx:547
 AliFMDReconstructor.cxx:548
 AliFMDReconstructor.cxx:549
 AliFMDReconstructor.cxx:550
 AliFMDReconstructor.cxx:551
 AliFMDReconstructor.cxx:552
 AliFMDReconstructor.cxx:553
 AliFMDReconstructor.cxx:554
 AliFMDReconstructor.cxx:555
 AliFMDReconstructor.cxx:556
 AliFMDReconstructor.cxx:557
 AliFMDReconstructor.cxx:558
 AliFMDReconstructor.cxx:559
 AliFMDReconstructor.cxx:560
 AliFMDReconstructor.cxx:561
 AliFMDReconstructor.cxx:562
 AliFMDReconstructor.cxx:563
 AliFMDReconstructor.cxx:564
 AliFMDReconstructor.cxx:565
 AliFMDReconstructor.cxx:566
 AliFMDReconstructor.cxx:567
 AliFMDReconstructor.cxx:568
 AliFMDReconstructor.cxx:569
 AliFMDReconstructor.cxx:570
 AliFMDReconstructor.cxx:571
 AliFMDReconstructor.cxx:572
 AliFMDReconstructor.cxx:573
 AliFMDReconstructor.cxx:574
 AliFMDReconstructor.cxx:575
 AliFMDReconstructor.cxx:576
 AliFMDReconstructor.cxx:577
 AliFMDReconstructor.cxx:578
 AliFMDReconstructor.cxx:579
 AliFMDReconstructor.cxx:580
 AliFMDReconstructor.cxx:581
 AliFMDReconstructor.cxx:582
 AliFMDReconstructor.cxx:583
 AliFMDReconstructor.cxx:584
 AliFMDReconstructor.cxx:585
 AliFMDReconstructor.cxx:586
 AliFMDReconstructor.cxx:587
 AliFMDReconstructor.cxx:588
 AliFMDReconstructor.cxx:589
 AliFMDReconstructor.cxx:590
 AliFMDReconstructor.cxx:591
 AliFMDReconstructor.cxx:592
 AliFMDReconstructor.cxx:593
 AliFMDReconstructor.cxx:594
 AliFMDReconstructor.cxx:595
 AliFMDReconstructor.cxx:596
 AliFMDReconstructor.cxx:597
 AliFMDReconstructor.cxx:598
 AliFMDReconstructor.cxx:599
 AliFMDReconstructor.cxx:600
 AliFMDReconstructor.cxx:601
 AliFMDReconstructor.cxx:602
 AliFMDReconstructor.cxx:603
 AliFMDReconstructor.cxx:604
 AliFMDReconstructor.cxx:605
 AliFMDReconstructor.cxx:606
 AliFMDReconstructor.cxx:607
 AliFMDReconstructor.cxx:608
 AliFMDReconstructor.cxx:609
 AliFMDReconstructor.cxx:610
 AliFMDReconstructor.cxx:611
 AliFMDReconstructor.cxx:612
 AliFMDReconstructor.cxx:613
 AliFMDReconstructor.cxx:614
 AliFMDReconstructor.cxx:615
 AliFMDReconstructor.cxx:616
 AliFMDReconstructor.cxx:617
 AliFMDReconstructor.cxx:618
 AliFMDReconstructor.cxx:619
 AliFMDReconstructor.cxx:620
 AliFMDReconstructor.cxx:621
 AliFMDReconstructor.cxx:622
 AliFMDReconstructor.cxx:623
 AliFMDReconstructor.cxx:624
 AliFMDReconstructor.cxx:625
 AliFMDReconstructor.cxx:626
 AliFMDReconstructor.cxx:627
 AliFMDReconstructor.cxx:628
 AliFMDReconstructor.cxx:629
 AliFMDReconstructor.cxx:630
 AliFMDReconstructor.cxx:631
 AliFMDReconstructor.cxx:632
 AliFMDReconstructor.cxx:633
 AliFMDReconstructor.cxx:634
 AliFMDReconstructor.cxx:635
 AliFMDReconstructor.cxx:636
 AliFMDReconstructor.cxx:637
 AliFMDReconstructor.cxx:638
 AliFMDReconstructor.cxx:639
 AliFMDReconstructor.cxx:640
 AliFMDReconstructor.cxx:641
 AliFMDReconstructor.cxx:642
 AliFMDReconstructor.cxx:643
 AliFMDReconstructor.cxx:644
 AliFMDReconstructor.cxx:645
 AliFMDReconstructor.cxx:646
 AliFMDReconstructor.cxx:647
 AliFMDReconstructor.cxx:648
 AliFMDReconstructor.cxx:649
 AliFMDReconstructor.cxx:650
 AliFMDReconstructor.cxx:651
 AliFMDReconstructor.cxx:652
 AliFMDReconstructor.cxx:653
 AliFMDReconstructor.cxx:654
 AliFMDReconstructor.cxx:655
 AliFMDReconstructor.cxx:656
 AliFMDReconstructor.cxx:657
 AliFMDReconstructor.cxx:658
 AliFMDReconstructor.cxx:659
 AliFMDReconstructor.cxx:660
 AliFMDReconstructor.cxx:661
 AliFMDReconstructor.cxx:662
 AliFMDReconstructor.cxx:663
 AliFMDReconstructor.cxx:664
 AliFMDReconstructor.cxx:665
 AliFMDReconstructor.cxx:666
 AliFMDReconstructor.cxx:667
 AliFMDReconstructor.cxx:668
 AliFMDReconstructor.cxx:669
 AliFMDReconstructor.cxx:670
 AliFMDReconstructor.cxx:671
 AliFMDReconstructor.cxx:672
 AliFMDReconstructor.cxx:673
 AliFMDReconstructor.cxx:674
 AliFMDReconstructor.cxx:675
 AliFMDReconstructor.cxx:676
 AliFMDReconstructor.cxx:677
 AliFMDReconstructor.cxx:678
 AliFMDReconstructor.cxx:679
 AliFMDReconstructor.cxx:680
 AliFMDReconstructor.cxx:681
 AliFMDReconstructor.cxx:682
 AliFMDReconstructor.cxx:683
 AliFMDReconstructor.cxx:684
 AliFMDReconstructor.cxx:685
 AliFMDReconstructor.cxx:686
 AliFMDReconstructor.cxx:687
 AliFMDReconstructor.cxx:688
 AliFMDReconstructor.cxx:689
 AliFMDReconstructor.cxx:690
 AliFMDReconstructor.cxx:691
 AliFMDReconstructor.cxx:692
 AliFMDReconstructor.cxx:693
 AliFMDReconstructor.cxx:694
 AliFMDReconstructor.cxx:695
 AliFMDReconstructor.cxx:696
 AliFMDReconstructor.cxx:697
 AliFMDReconstructor.cxx:698
 AliFMDReconstructor.cxx:699
 AliFMDReconstructor.cxx:700
 AliFMDReconstructor.cxx:701
 AliFMDReconstructor.cxx:702
 AliFMDReconstructor.cxx:703
 AliFMDReconstructor.cxx:704
 AliFMDReconstructor.cxx:705
 AliFMDReconstructor.cxx:706
 AliFMDReconstructor.cxx:707
 AliFMDReconstructor.cxx:708
 AliFMDReconstructor.cxx:709
 AliFMDReconstructor.cxx:710
 AliFMDReconstructor.cxx:711
 AliFMDReconstructor.cxx:712
 AliFMDReconstructor.cxx:713
 AliFMDReconstructor.cxx:714
 AliFMDReconstructor.cxx:715
 AliFMDReconstructor.cxx:716
 AliFMDReconstructor.cxx:717
 AliFMDReconstructor.cxx:718
 AliFMDReconstructor.cxx:719
 AliFMDReconstructor.cxx:720
 AliFMDReconstructor.cxx:721
 AliFMDReconstructor.cxx:722
 AliFMDReconstructor.cxx:723
 AliFMDReconstructor.cxx:724
 AliFMDReconstructor.cxx:725
 AliFMDReconstructor.cxx:726
 AliFMDReconstructor.cxx:727
 AliFMDReconstructor.cxx:728
 AliFMDReconstructor.cxx:729
 AliFMDReconstructor.cxx:730
 AliFMDReconstructor.cxx:731
 AliFMDReconstructor.cxx:732
 AliFMDReconstructor.cxx:733
 AliFMDReconstructor.cxx:734
 AliFMDReconstructor.cxx:735
 AliFMDReconstructor.cxx:736
 AliFMDReconstructor.cxx:737
 AliFMDReconstructor.cxx:738
 AliFMDReconstructor.cxx:739
 AliFMDReconstructor.cxx:740
 AliFMDReconstructor.cxx:741
 AliFMDReconstructor.cxx:742
 AliFMDReconstructor.cxx:743
 AliFMDReconstructor.cxx:744
 AliFMDReconstructor.cxx:745
 AliFMDReconstructor.cxx:746
 AliFMDReconstructor.cxx:747
 AliFMDReconstructor.cxx:748
 AliFMDReconstructor.cxx:749
 AliFMDReconstructor.cxx:750
 AliFMDReconstructor.cxx:751
 AliFMDReconstructor.cxx:752
 AliFMDReconstructor.cxx:753
 AliFMDReconstructor.cxx:754
 AliFMDReconstructor.cxx:755
 AliFMDReconstructor.cxx:756
 AliFMDReconstructor.cxx:757
 AliFMDReconstructor.cxx:758
 AliFMDReconstructor.cxx:759
 AliFMDReconstructor.cxx:760
 AliFMDReconstructor.cxx:761
 AliFMDReconstructor.cxx:762
 AliFMDReconstructor.cxx:763
 AliFMDReconstructor.cxx:764
 AliFMDReconstructor.cxx:765
 AliFMDReconstructor.cxx:766
 AliFMDReconstructor.cxx:767
 AliFMDReconstructor.cxx:768
 AliFMDReconstructor.cxx:769
 AliFMDReconstructor.cxx:770
 AliFMDReconstructor.cxx:771
 AliFMDReconstructor.cxx:772
 AliFMDReconstructor.cxx:773
 AliFMDReconstructor.cxx:774
 AliFMDReconstructor.cxx:775
 AliFMDReconstructor.cxx:776
 AliFMDReconstructor.cxx:777
 AliFMDReconstructor.cxx:778
 AliFMDReconstructor.cxx:779
 AliFMDReconstructor.cxx:780
 AliFMDReconstructor.cxx:781
 AliFMDReconstructor.cxx:782
 AliFMDReconstructor.cxx:783
 AliFMDReconstructor.cxx:784
 AliFMDReconstructor.cxx:785
 AliFMDReconstructor.cxx:786
 AliFMDReconstructor.cxx:787
 AliFMDReconstructor.cxx:788
 AliFMDReconstructor.cxx:789
 AliFMDReconstructor.cxx:790
 AliFMDReconstructor.cxx:791
 AliFMDReconstructor.cxx:792
 AliFMDReconstructor.cxx:793
 AliFMDReconstructor.cxx:794
 AliFMDReconstructor.cxx:795
 AliFMDReconstructor.cxx:796
 AliFMDReconstructor.cxx:797
 AliFMDReconstructor.cxx:798
 AliFMDReconstructor.cxx:799
 AliFMDReconstructor.cxx:800
 AliFMDReconstructor.cxx:801
 AliFMDReconstructor.cxx:802
 AliFMDReconstructor.cxx:803
 AliFMDReconstructor.cxx:804
 AliFMDReconstructor.cxx:805
 AliFMDReconstructor.cxx:806
 AliFMDReconstructor.cxx:807
 AliFMDReconstructor.cxx:808
 AliFMDReconstructor.cxx:809
 AliFMDReconstructor.cxx:810
 AliFMDReconstructor.cxx:811
 AliFMDReconstructor.cxx:812
 AliFMDReconstructor.cxx:813
 AliFMDReconstructor.cxx:814
 AliFMDReconstructor.cxx:815
 AliFMDReconstructor.cxx:816
 AliFMDReconstructor.cxx:817
 AliFMDReconstructor.cxx:818
 AliFMDReconstructor.cxx:819
 AliFMDReconstructor.cxx:820
 AliFMDReconstructor.cxx:821
 AliFMDReconstructor.cxx:822
 AliFMDReconstructor.cxx:823
 AliFMDReconstructor.cxx:824
 AliFMDReconstructor.cxx:825
 AliFMDReconstructor.cxx:826
 AliFMDReconstructor.cxx:827
 AliFMDReconstructor.cxx:828
 AliFMDReconstructor.cxx:829
 AliFMDReconstructor.cxx:830
 AliFMDReconstructor.cxx:831
 AliFMDReconstructor.cxx:832
 AliFMDReconstructor.cxx:833
 AliFMDReconstructor.cxx:834
 AliFMDReconstructor.cxx:835
 AliFMDReconstructor.cxx:836
 AliFMDReconstructor.cxx:837
 AliFMDReconstructor.cxx:838
 AliFMDReconstructor.cxx:839
 AliFMDReconstructor.cxx:840
 AliFMDReconstructor.cxx:841
 AliFMDReconstructor.cxx:842
 AliFMDReconstructor.cxx:843
 AliFMDReconstructor.cxx:844
 AliFMDReconstructor.cxx:845
 AliFMDReconstructor.cxx:846
 AliFMDReconstructor.cxx:847
 AliFMDReconstructor.cxx:848
 AliFMDReconstructor.cxx:849
 AliFMDReconstructor.cxx:850
 AliFMDReconstructor.cxx:851
 AliFMDReconstructor.cxx:852
 AliFMDReconstructor.cxx:853
 AliFMDReconstructor.cxx:854
 AliFMDReconstructor.cxx:855
 AliFMDReconstructor.cxx:856
 AliFMDReconstructor.cxx:857
 AliFMDReconstructor.cxx:858
 AliFMDReconstructor.cxx:859
 AliFMDReconstructor.cxx:860
 AliFMDReconstructor.cxx:861
 AliFMDReconstructor.cxx:862
 AliFMDReconstructor.cxx:863
 AliFMDReconstructor.cxx:864
 AliFMDReconstructor.cxx:865
 AliFMDReconstructor.cxx:866
 AliFMDReconstructor.cxx:867
 AliFMDReconstructor.cxx:868
 AliFMDReconstructor.cxx:869
 AliFMDReconstructor.cxx:870
 AliFMDReconstructor.cxx:871
 AliFMDReconstructor.cxx:872
 AliFMDReconstructor.cxx:873
 AliFMDReconstructor.cxx:874
 AliFMDReconstructor.cxx:875
 AliFMDReconstructor.cxx:876
 AliFMDReconstructor.cxx:877
 AliFMDReconstructor.cxx:878
 AliFMDReconstructor.cxx:879
 AliFMDReconstructor.cxx:880
 AliFMDReconstructor.cxx:881
 AliFMDReconstructor.cxx:882
 AliFMDReconstructor.cxx:883
 AliFMDReconstructor.cxx:884
 AliFMDReconstructor.cxx:885
 AliFMDReconstructor.cxx:886
 AliFMDReconstructor.cxx:887
 AliFMDReconstructor.cxx:888
 AliFMDReconstructor.cxx:889
 AliFMDReconstructor.cxx:890
 AliFMDReconstructor.cxx:891
 AliFMDReconstructor.cxx:892
 AliFMDReconstructor.cxx:893
 AliFMDReconstructor.cxx:894
 AliFMDReconstructor.cxx:895
 AliFMDReconstructor.cxx:896
 AliFMDReconstructor.cxx:897
 AliFMDReconstructor.cxx:898
 AliFMDReconstructor.cxx:899
 AliFMDReconstructor.cxx:900
 AliFMDReconstructor.cxx:901
 AliFMDReconstructor.cxx:902
 AliFMDReconstructor.cxx:903
 AliFMDReconstructor.cxx:904
 AliFMDReconstructor.cxx:905
 AliFMDReconstructor.cxx:906
 AliFMDReconstructor.cxx:907
 AliFMDReconstructor.cxx:908
 AliFMDReconstructor.cxx:909
 AliFMDReconstructor.cxx:910
 AliFMDReconstructor.cxx:911
 AliFMDReconstructor.cxx:912
 AliFMDReconstructor.cxx:913
 AliFMDReconstructor.cxx:914
 AliFMDReconstructor.cxx:915
 AliFMDReconstructor.cxx:916
 AliFMDReconstructor.cxx:917
 AliFMDReconstructor.cxx:918
 AliFMDReconstructor.cxx:919
 AliFMDReconstructor.cxx:920
 AliFMDReconstructor.cxx:921
 AliFMDReconstructor.cxx:922
 AliFMDReconstructor.cxx:923
 AliFMDReconstructor.cxx:924
 AliFMDReconstructor.cxx:925
 AliFMDReconstructor.cxx:926
 AliFMDReconstructor.cxx:927
 AliFMDReconstructor.cxx:928
 AliFMDReconstructor.cxx:929
 AliFMDReconstructor.cxx:930
 AliFMDReconstructor.cxx:931
 AliFMDReconstructor.cxx:932
 AliFMDReconstructor.cxx:933
 AliFMDReconstructor.cxx:934
 AliFMDReconstructor.cxx:935
 AliFMDReconstructor.cxx:936
 AliFMDReconstructor.cxx:937
 AliFMDReconstructor.cxx:938
 AliFMDReconstructor.cxx:939
 AliFMDReconstructor.cxx:940
 AliFMDReconstructor.cxx:941
 AliFMDReconstructor.cxx:942
 AliFMDReconstructor.cxx:943
 AliFMDReconstructor.cxx:944
 AliFMDReconstructor.cxx:945
 AliFMDReconstructor.cxx:946
 AliFMDReconstructor.cxx:947
 AliFMDReconstructor.cxx:948
 AliFMDReconstructor.cxx:949
 AliFMDReconstructor.cxx:950
 AliFMDReconstructor.cxx:951
 AliFMDReconstructor.cxx:952
 AliFMDReconstructor.cxx:953
 AliFMDReconstructor.cxx:954
 AliFMDReconstructor.cxx:955
 AliFMDReconstructor.cxx:956
 AliFMDReconstructor.cxx:957
 AliFMDReconstructor.cxx:958
 AliFMDReconstructor.cxx:959
 AliFMDReconstructor.cxx:960
 AliFMDReconstructor.cxx:961
 AliFMDReconstructor.cxx:962
 AliFMDReconstructor.cxx:963
 AliFMDReconstructor.cxx:964
 AliFMDReconstructor.cxx:965
 AliFMDReconstructor.cxx:966
 AliFMDReconstructor.cxx:967
 AliFMDReconstructor.cxx:968
 AliFMDReconstructor.cxx:969
 AliFMDReconstructor.cxx:970
 AliFMDReconstructor.cxx:971
 AliFMDReconstructor.cxx:972
 AliFMDReconstructor.cxx:973
 AliFMDReconstructor.cxx:974
 AliFMDReconstructor.cxx:975
 AliFMDReconstructor.cxx:976
 AliFMDReconstructor.cxx:977
 AliFMDReconstructor.cxx:978
 AliFMDReconstructor.cxx:979
 AliFMDReconstructor.cxx:980
 AliFMDReconstructor.cxx:981
 AliFMDReconstructor.cxx:982
 AliFMDReconstructor.cxx:983
 AliFMDReconstructor.cxx:984
 AliFMDReconstructor.cxx:985
 AliFMDReconstructor.cxx:986
 AliFMDReconstructor.cxx:987
 AliFMDReconstructor.cxx:988
 AliFMDReconstructor.cxx:989
 AliFMDReconstructor.cxx:990
 AliFMDReconstructor.cxx:991
 AliFMDReconstructor.cxx:992
 AliFMDReconstructor.cxx:993
 AliFMDReconstructor.cxx:994
 AliFMDReconstructor.cxx:995
 AliFMDReconstructor.cxx:996
 AliFMDReconstructor.cxx:997
 AliFMDReconstructor.cxx:998
 AliFMDReconstructor.cxx:999
 AliFMDReconstructor.cxx:1000
 AliFMDReconstructor.cxx:1001
 AliFMDReconstructor.cxx:1002
 AliFMDReconstructor.cxx:1003
 AliFMDReconstructor.cxx:1004
 AliFMDReconstructor.cxx:1005
 AliFMDReconstructor.cxx:1006
 AliFMDReconstructor.cxx:1007
 AliFMDReconstructor.cxx:1008
 AliFMDReconstructor.cxx:1009
 AliFMDReconstructor.cxx:1010
 AliFMDReconstructor.cxx:1011
 AliFMDReconstructor.cxx:1012
 AliFMDReconstructor.cxx:1013
 AliFMDReconstructor.cxx:1014
 AliFMDReconstructor.cxx:1015
 AliFMDReconstructor.cxx:1016
 AliFMDReconstructor.cxx:1017
 AliFMDReconstructor.cxx:1018
 AliFMDReconstructor.cxx:1019
 AliFMDReconstructor.cxx:1020
 AliFMDReconstructor.cxx:1021
 AliFMDReconstructor.cxx:1022
 AliFMDReconstructor.cxx:1023
 AliFMDReconstructor.cxx:1024
 AliFMDReconstructor.cxx:1025
 AliFMDReconstructor.cxx:1026
 AliFMDReconstructor.cxx:1027
 AliFMDReconstructor.cxx:1028
 AliFMDReconstructor.cxx:1029
 AliFMDReconstructor.cxx:1030
 AliFMDReconstructor.cxx:1031
 AliFMDReconstructor.cxx:1032
 AliFMDReconstructor.cxx:1033
 AliFMDReconstructor.cxx:1034
 AliFMDReconstructor.cxx:1035
 AliFMDReconstructor.cxx:1036
 AliFMDReconstructor.cxx:1037
 AliFMDReconstructor.cxx:1038
 AliFMDReconstructor.cxx:1039
 AliFMDReconstructor.cxx:1040
 AliFMDReconstructor.cxx:1041
 AliFMDReconstructor.cxx:1042
 AliFMDReconstructor.cxx:1043
 AliFMDReconstructor.cxx:1044
 AliFMDReconstructor.cxx:1045
 AliFMDReconstructor.cxx:1046
 AliFMDReconstructor.cxx:1047
 AliFMDReconstructor.cxx:1048
 AliFMDReconstructor.cxx:1049
 AliFMDReconstructor.cxx:1050
 AliFMDReconstructor.cxx:1051
 AliFMDReconstructor.cxx:1052
 AliFMDReconstructor.cxx:1053
 AliFMDReconstructor.cxx:1054
 AliFMDReconstructor.cxx:1055
 AliFMDReconstructor.cxx:1056
 AliFMDReconstructor.cxx:1057
 AliFMDReconstructor.cxx:1058
 AliFMDReconstructor.cxx:1059
 AliFMDReconstructor.cxx:1060
 AliFMDReconstructor.cxx:1061
 AliFMDReconstructor.cxx:1062
 AliFMDReconstructor.cxx:1063
 AliFMDReconstructor.cxx:1064
 AliFMDReconstructor.cxx:1065
 AliFMDReconstructor.cxx:1066
 AliFMDReconstructor.cxx:1067
 AliFMDReconstructor.cxx:1068
 AliFMDReconstructor.cxx:1069
 AliFMDReconstructor.cxx:1070
 AliFMDReconstructor.cxx:1071
 AliFMDReconstructor.cxx:1072
 AliFMDReconstructor.cxx:1073
 AliFMDReconstructor.cxx:1074
 AliFMDReconstructor.cxx:1075
 AliFMDReconstructor.cxx:1076
 AliFMDReconstructor.cxx:1077
 AliFMDReconstructor.cxx:1078
 AliFMDReconstructor.cxx:1079
 AliFMDReconstructor.cxx:1080
 AliFMDReconstructor.cxx:1081
 AliFMDReconstructor.cxx:1082
 AliFMDReconstructor.cxx:1083
 AliFMDReconstructor.cxx:1084
 AliFMDReconstructor.cxx:1085
 AliFMDReconstructor.cxx:1086
 AliFMDReconstructor.cxx:1087
 AliFMDReconstructor.cxx:1088
 AliFMDReconstructor.cxx:1089
 AliFMDReconstructor.cxx:1090
 AliFMDReconstructor.cxx:1091
 AliFMDReconstructor.cxx:1092
 AliFMDReconstructor.cxx:1093
 AliFMDReconstructor.cxx:1094
 AliFMDReconstructor.cxx:1095
 AliFMDReconstructor.cxx:1096
 AliFMDReconstructor.cxx:1097
 AliFMDReconstructor.cxx:1098
 AliFMDReconstructor.cxx:1099
 AliFMDReconstructor.cxx:1100
 AliFMDReconstructor.cxx:1101
 AliFMDReconstructor.cxx:1102
 AliFMDReconstructor.cxx:1103
 AliFMDReconstructor.cxx:1104
 AliFMDReconstructor.cxx:1105
 AliFMDReconstructor.cxx:1106
 AliFMDReconstructor.cxx:1107
 AliFMDReconstructor.cxx:1108
 AliFMDReconstructor.cxx:1109
 AliFMDReconstructor.cxx:1110
 AliFMDReconstructor.cxx:1111
 AliFMDReconstructor.cxx:1112
 AliFMDReconstructor.cxx:1113
 AliFMDReconstructor.cxx:1114
 AliFMDReconstructor.cxx:1115
 AliFMDReconstructor.cxx:1116
 AliFMDReconstructor.cxx:1117
 AliFMDReconstructor.cxx:1118
 AliFMDReconstructor.cxx:1119
 AliFMDReconstructor.cxx:1120
 AliFMDReconstructor.cxx:1121
 AliFMDReconstructor.cxx:1122
 AliFMDReconstructor.cxx:1123
 AliFMDReconstructor.cxx:1124