ROOT logo
// **************************************************************************
// * 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.                  *
// **************************************************************************

//====================================================================================================================================================
//
//      Main class of the ALICE Muon Forward Tracker
//
//      Contact author: antonio.uras@cern.ch
//
//====================================================================================================================================================

#include "AliLog.h"
#include "TFile.h"  
#include "TGeoManager.h"    
#include "TGeoVolume.h"
#include "TGeoMatrix.h"
#include "TVirtualMC.h"
#include "TClonesArray.h"
#include "TGeoGlobalMagField.h"
#include "AliRun.h"
#include "AliLoader.h"
#include "AliDetector.h"
#include "AliMC.h"
#include "AliMagF.h"
#include "AliMFT.h"
#include "AliMFTHit.h"
#include "AliMFTDigit.h"
#include "AliMFTCluster.h"
#include "AliTrackReference.h"
#include "AliMFTSegmentation.h"
#include "AliMFTDigitizer.h"
#include "AliMFTPlane.h"
#include "TString.h"
#include "TObjArray.h"

ClassImp(AliMFT) 

//====================================================================================================================================================

AliMFT::AliMFT():
  AliDetector(),
  fVersion(1),
  fNPlanes(0),
  fNSlices(1),
  fSDigitsPerPlane(0),
  fDigitsPerPlane(0),
  fRecPointsPerPlane(0),
  fSideDigits(0),
  fSegmentation(0),
  fNameGeomFile(0),
  fChargeDispersion(25.e-4),
  fSingleStepForChargeDispersion(0),
  fNStepForChargeDispersion(4),
  fDensitySupportOverSi(0.036),
  fFileNameForUnderyingEvent(0), 
  fFileNameForPileUpEvents(0),
  fNPileUpEvents(0), 
  fUnderlyingEventID(-1)
{

  // default constructor

  for (Int_t iPileUp=0; iPileUp<AliMFTConstants::fNMaxPileUpEvents; iPileUp++) fPileUpEventsIDs[iPileUp] = -1;


}

//====================================================================================================================================================

AliMFT::AliMFT(const Char_t *name, const Char_t *title):
  AliDetector(name, title),
  fVersion(1),
  fNPlanes(0),
  fNSlices(1),
  fSDigitsPerPlane(0),
  fDigitsPerPlane(0),
  fRecPointsPerPlane(0),
  fSideDigits(0),
  fSegmentation(0),
  fNameGeomFile(0),
  fChargeDispersion(25.e-4),
  fSingleStepForChargeDispersion(0),
  fNStepForChargeDispersion(4),
  fDensitySupportOverSi(0.036),
  fFileNameForUnderyingEvent(0), 
  fFileNameForPileUpEvents(0),
  fNPileUpEvents(0), 
  fUnderlyingEventID(-1)
{

  for (Int_t iPileUp=0; iPileUp<AliMFTConstants::fNMaxPileUpEvents; iPileUp++) fPileUpEventsIDs[iPileUp] = -1;

  fNameGeomFile = "AliMFTGeometry.root";

  SetGeometry();

  Init();

}

//====================================================================================================================================================

AliMFT::AliMFT(const Char_t *name, const Char_t *title, Char_t *nameGeomFile):
  AliDetector(name, title),
  fVersion(1),
  fNPlanes(0),
  fNSlices(1),
  fSDigitsPerPlane(0),
  fDigitsPerPlane(0),
  fRecPointsPerPlane(0),
  fSideDigits(0),
  fSegmentation(0),
  fNameGeomFile(0),
  fChargeDispersion(25.e-4),
  fSingleStepForChargeDispersion(0),
  fNStepForChargeDispersion(4),
  fDensitySupportOverSi(0.036),
  fFileNameForUnderyingEvent(0), 
  fFileNameForPileUpEvents(0),
  fNPileUpEvents(0), 
  fUnderlyingEventID(-1)
{

  for (Int_t iPileUp=0; iPileUp<AliMFTConstants::fNMaxPileUpEvents; iPileUp++) fPileUpEventsIDs[iPileUp] = -1;

  fNameGeomFile = nameGeomFile;

  SetGeometry();

  Init();

}

//====================================================================================================================================================

AliMFT::~AliMFT() {

  if (fSDigitsPerPlane)   { fSDigitsPerPlane->Delete();    delete fSDigitsPerPlane;   }
  if (fDigitsPerPlane)    { fDigitsPerPlane->Delete();     delete fDigitsPerPlane;    }
  if (fRecPointsPerPlane) { fRecPointsPerPlane->Delete();  delete fRecPointsPerPlane; }

}

//====================================================================================================================================================

void AliMFT::CreateMaterials() {

  // Definition of MFT materials  - to be updated to the most recent values

  AliInfo("Start MFT materials");

  // data from PDG booklet 2002                 density [gr/cm^3]     rad len [cm]           abs len [cm]    
  Float_t   aSi = 28.085 ,    zSi   = 14. ,     dSi      =  2.329 ,   radSi   =  21.82/dSi , absSi   = 108.4/dSi  ;    // Silicon
  Float_t   aCarb = 12.01 ,   zCarb =  6. ,     dCarb    =  2.265 ,   radCarb =  18.8 ,      absCarb = 49.9       ;    // Carbon
  Float_t   aAlu = 26.98 ,    zAlu  = 13. ,     dAlu     =  2.70  ,   radAlu  =  8.897 ,     absAlu  = 39.70      ;    // Aluminum

  // Air mixture
  const Int_t nAir = 4;   
  Float_t   aAir[nAir] = {12, 14, 16, 36} ,  zAir[nAir] = {6, 7, 8, 18} ,   wAir[nAir]={0.000124, 0.755267, 0.231781, 0.012827} , dAir=0.00120479;   

  // Water mixture
  const Int_t nWater = 2;   
  Float_t   aWater[nWater] = {1.00794, 15.9994} ,  zWater[nWater] = {1, 8} ,   wWater[nWater] = {0.111894, 0.888106} , dWater=1.;   

  // SiO2 mixture
  const Int_t nSiO2 = 2; 
  Float_t   aSiO2[nSiO2] = {15.9994, 28.0855} ,   zSiO2[nSiO2] = {8., 14.} ,   wSiO2[nSiO2] = {0.532565, 0.467435} , dSiO2 = 2.20;  

  // Inox mixture
  const Int_t nInox = 9;
  Float_t   aInox[nInox] = {12.0107, 54.9380, 28.0855, 30.9738, 32.0660, 58.6928, 51.9961, 95.9400, 55.8450} ;   
  Float_t   zInox[nInox] = { 6,      25,      14,      15,      16,      28,      24,      42,      26     } ;   
  Float_t   wInox[nInox] = {0.0003,  0.02,    0.01,    0.00045, 0.0003,  0.12,    0.17,    0.025,   0.65395} ;
  Float_t   dInox = 8.03; 
  
  Int_t   matId  = 0;                        // tmp material id number
  Int_t   unsens = 0, sens=1;                // sensitive or unsensitive medium
  Int_t   itgfld = 3;			     // type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
  Float_t maxfld = 5.; 		             // max field value

  Float_t tmaxfd = -10.0;                    // max deflection angle due to magnetic field in one step
  Float_t stemax =  0.001;                   // max step allowed [cm]
  Float_t deemax = -0.2;                     // maximum fractional energy loss in one step 0<deemax<=1  
  Float_t epsil  =  0.001;                   // tracking precision [cm]   
  Float_t stmin  = -0.001;                   // minimum step due to continuous processes [cm] (negative value: choose it automatically)

  Float_t tmaxfdSi =  0.1;                   // max deflection angle due to magnetic field in one step
  Float_t stemaxSi =  5.0e-4;                // maximum step allowed [cm]
  Float_t deemaxSi =  0.1;                   // maximum fractional energy loss in one step 0<deemax<=1
  Float_t epsilSi  =  0.5e-4;                // tracking precision [cm]
  Float_t stminSi  = -0.001;                 // minimum step due to continuous processes [cm] (negative value: choose it automatically)

  Int_t   isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();   // from CreateMaterials in STRUCT/AliPIPEv3.cxx
  Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();     // from CreateMaterials in STRUCT/AliPIPEv3.cxx
      
  AliMixture(++matId,"Air", aAir, zAir, dAir, nAir, wAir); 
  AliMedium(kAir,    "Air", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
  
  AliMaterial(++matId, "Si", aSi, zSi, dSi, radSi, absSi);  
  AliMedium(kSi,       "Si", matId, sens, isxfld, sxmgmx, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);

  AliMaterial(++matId, "Readout", aSi, zSi, dSi, radSi, absSi);  
  AliMedium(kReadout,  "Readout", matId, unsens, isxfld, sxmgmx, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);

  AliMaterial(++matId, "Support", aSi, zSi, dSi*fDensitySupportOverSi, radSi/fDensitySupportOverSi, absSi/fDensitySupportOverSi);  
  AliMedium(kSupport,  "Support", matId, unsens, isxfld, sxmgmx, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
  
  AliMaterial(++matId, "Carbon", aCarb, zCarb, dCarb, radCarb, absCarb );
  AliMedium(kCarbon,   "Carbon", matId, unsens, isxfld,  sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
  
  AliMaterial(++matId, "Alu", aAlu, zAlu, dAlu, radAlu, absAlu);
  AliMedium(kAlu,      "Alu", matId, unsens, isxfld,  sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
  
  AliMixture(++matId, "Water", aWater, zWater, dWater, nWater, wWater);
  AliMedium(kWater,   "Water", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
  
  AliMixture(++matId, "SiO2", aSiO2, zSiO2, dSiO2, nSiO2, wSiO2);
  AliMedium(kSiO2,    "SiO2", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
  
  AliMixture(++matId, "Inox", aInox, zInox, dInox, nInox, wInox);
  AliMedium(kInox,    "Inox", matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);

  AliInfo("End MFT materials");
          
}

//====================================================================================================================================================

void AliMFT::CreateGeometry() {

  // Creates detailed geometry simulation (currently GEANT volumes tree)        

  AliInfo("Start MFT preliminary version building");
  if(!TVirtualMC::GetMC()->IsRootGeometrySupported()) return;                
  TGeoVolumeAssembly *vol = CreateVol();
  AliInfo("TGeoVolumeAssembly created!");
  gGeoManager->GetVolume("ALIC")->AddNode(vol,0);
  AliInfo("Stop MFT preliminary version building");

  if (fNStepForChargeDispersion) fSingleStepForChargeDispersion = fChargeDispersion/Double_t(fNStepForChargeDispersion);

} 

//====================================================================================================================================================

void AliMFT::AddAlignableVolumes() {

  // Create entries for alignable volumes associating the symbolic volume
  // name with the corresponding volume path. Needs to be syncronized with
  // eventual changes in the geometry.

  TString sysName = "MFT";
  TString volPath = "/ALIC_1/MFT_0";
  
  if (!gGeoManager->SetAlignableEntry(sysName.Data(),volPath.Data())) {
    AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", sysName.Data(), volPath.Data()));
  }  

}

//====================================================================================================================================================

void AliMFT::StepManager() {

  // Full Step Manager

  AliDebug(2, Form("Entering StepManager: TVirtualMC::GetMC()->CurrentVolName() = %s", TVirtualMC::GetMC()->CurrentVolName()));

  if (!fSegmentation) AliFatal("No segmentation available");

  if (!(this->IsActive())) return;
  if (!(TVirtualMC::GetMC()->TrackCharge())) return;

  TString planeNumber   = TVirtualMC::GetMC()->CurrentVolName();
  TString detElemNumber = TVirtualMC::GetMC()->CurrentVolName();
  if (!(planeNumber.Contains("active"))) return;
  planeNumber.Remove(0,9);
  detElemNumber.Remove(0,18);
  planeNumber.Remove(2);
  detElemNumber.Remove(3);
  Int_t detElemID = fSegmentation->GetDetElemGlobalID(planeNumber.Atoi(), detElemNumber.Atoi());

  if (TVirtualMC::GetMC()->IsTrackExiting()) {
    AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kMFT);
  }

  static TLorentzVector position, momentum;
  static AliMFTHit hit;
  
  Int_t  status = 0;
  
  // Track status
  if (TVirtualMC::GetMC()->IsTrackInside())      status +=  1;
  if (TVirtualMC::GetMC()->IsTrackEntering())    status +=  2;
  if (TVirtualMC::GetMC()->IsTrackExiting())     status +=  4;
  if (TVirtualMC::GetMC()->IsTrackOut())         status +=  8;
  if (TVirtualMC::GetMC()->IsTrackDisappeared()) status += 16;
  if (TVirtualMC::GetMC()->IsTrackStop())        status += 32;
  if (TVirtualMC::GetMC()->IsTrackAlive())       status += 64;

  // ---------- Fill hit structure

  hit.SetDetElemID(detElemID);
  hit.SetPlane(planeNumber.Atoi());
  hit.SetTrack(gAlice->GetMCApp()->GetCurrentTrackNumber());
    
  TVirtualMC::GetMC()->TrackPosition(position);
  TVirtualMC::GetMC()->TrackMomentum(momentum);

  AliDebug(1, Form("AliMFT::StepManager()->%s Hit #%06d (x=%f, y=%f, z=%f) belongs to track %02d\n", 
		   TVirtualMC::GetMC()->CurrentVolName(), fNhits, position.X(), position.Y(), position.Z(), gAlice->GetMCApp()->GetCurrentTrackNumber())); 

  hit.SetPosition(position);
  hit.SetTOF(TVirtualMC::GetMC()->TrackTime());
  hit.SetMomentum(momentum);
  hit.SetStatus(status);
  hit.SetEloss(TVirtualMC::GetMC()->Edep());
  //  hit.SetShunt(GetIshunt());
//   if (TVirtualMC::GetMC()->IsTrackEntering()) {
//     hit.SetStartPosition(position);
//     hit.SetStartTime(TVirtualMC::GetMC()->TrackTime());
//     hit.SetStartStatus(status);
//     return; // don't save entering hit.
//   } 

  // Fill hit structure with this new hit.
  new ((*fHits)[fNhits++]) AliMFTHit(hit);

  // Save old position... for next hit.
//   hit.SetStartPosition(position);
//   hit.SetStartTime(TVirtualMC::GetMC()->TrackTime());
//   hit.SetStartStatus(status);

  return;

}

//====================================================================================================================================================

TGeoVolumeAssembly* AliMFT::CreateVol() {

  // method to create the MFT Geometry (silicon circular planes)

  if (!fSegmentation) CreateGeometry();
  
  TGeoVolumeAssembly *vol = new TGeoVolumeAssembly("MFT");
  TGeoMedium *silicon = gGeoManager->GetMedium("MFT_Si");
  TGeoMedium *readout = gGeoManager->GetMedium("MFT_Readout");
  TGeoMedium *support = gGeoManager->GetMedium("MFT_Support");
  TGeoMedium *carbon  = gGeoManager->GetMedium("MFT_Carbon");
  TGeoMedium *alu     = gGeoManager->GetMedium("MFT_Alu");
  TGeoMedium *water   = gGeoManager->GetMedium("MFT_Water");
  TGeoMedium *si02    = gGeoManager->GetMedium("MFT_SiO2");
  TGeoMedium *inox    = gGeoManager->GetMedium("MFT_Inox");

  // ---- Cage & Services Description --------------------------------------------
  // R. Tieulent - 17/01/2014 - Basic description for ITS/TPC matching studies
  // -----------------------------------------------------------------------------

  TGeoVolumeAssembly *cageNservices = new TGeoVolumeAssembly("MFT_cageNservices");
  
  // cage definition
  Float_t cageDz   = 150./2.;
  Float_t cageRMax = 49.5;
  Float_t cageRMin = cageRMax - 0.120; // 0.64% of X0
  
  TGeoVolume *cage = gGeoManager->MakeTube("MFT_cage", carbon, cageRMin, cageRMax, cageDz);
  cage->SetLineColor(kBlue);

  cageNservices->AddNode(cage,1,new TGeoTranslation(0., 0., 0. ));

  // Services definition
  TGeoVolumeAssembly *services = new TGeoVolumeAssembly("MFT_services");

  // Aluminum bus-Bar
  Float_t busBarDz = 150.;
  Float_t busBarThick = 0.1 ;
  Float_t busBarWidth = 1.;
  
  TGeoVolume *aluBusBar = gGeoManager->MakeBox("MFT_busbar", alu, busBarWidth/2., busBarThick/2., busBarDz/2.);
  aluBusBar->SetLineColor(kYellow);

  Int_t nBusBar = 30;
  Float_t dPhiBusBar = 2.*TMath::Pi() / nBusBar;
  Float_t dShift = cageRMin - busBarThick;
  
  TGeoRotation *rot;

  for (Int_t iBusBar=0; iBusBar<nBusBar; iBusBar++) {
    Float_t phi =  dPhiBusBar*iBusBar;
    Float_t xp = dShift*TMath::Cos(phi);
    Float_t yp = dShift*TMath::Sin(phi);
    rot = new TGeoRotation();
    rot->RotateZ(phi*TMath::RadToDeg()+90.);
    services->AddNode(aluBusBar, iBusBar+1, new TGeoCombiTrans(xp,yp,0,rot));
  }
  
  // Cooling Services  definition
  TGeoVolumeAssembly *cooling = new TGeoVolumeAssembly("MFT_cooling");
  // Cooling Water
  Float_t coolingDz = 150.;
  Float_t coolingR  = 0.3 /2. ; // 3mm in diameter
  Float_t coolingDR = 0.02 ;    // Thickness of the pipe 0.2mm
  
  TGeoVolume *coolingWater = gGeoManager->MakeTube("MFT_coolingWater", water, 0., coolingR, coolingDz/2.);
  coolingWater->SetLineColor(kCyan);
  cooling->AddNode(coolingWater, 1, new TGeoTranslation(0,0,0 ));

  // Cooling Pipes
  TGeoVolume *coolingPipes = gGeoManager->MakeTube("MFT_coolingPipes", inox, coolingR, coolingR+coolingDR, coolingDz/2.);
  coolingPipes->SetLineColor(kGray);
  cooling->AddNode(coolingPipes,1,new TGeoTranslation(0,0,0 ));
  
  Int_t nCooling = 18;
  dShift = cageRMin - coolingR ;
  Float_t phi0 = 0.02;
  
  for (Int_t iCooling=0; iCooling<nCooling; iCooling++) {
    Float_t phi ;
    if (iCooling<nCooling/2) phi = dPhiBusBar*(iCooling+3) + phi0;
    else phi = dPhiBusBar*(iCooling+9) + phi0;
    Float_t xp = dShift*TMath::Cos(phi);
    Float_t yp = dShift*TMath::Sin(phi);
    services->AddNode(cooling, iCooling+1, new TGeoTranslation(xp,yp,0 ));
  }
  
  // Optical Fibers
  Float_t fiberDz = 150.;
  Float_t fiberRadius = 0.0125 /2. ; // 0.125mm in diameter
  
  TGeoVolume *fiber = gGeoManager->MakeTube("MFT_fiber", si02, 0., fiberRadius, fiberDz/2.);
  fiber->SetLineColor(kCyan);

  Int_t nFiber = 340;
  dShift = cageRMin - 2*fiberRadius;
  phi0 = 0.03;
  
  for (Int_t iFiber=0; iFiber<nFiber; iFiber++) {
    Float_t phi = dPhiBusBar*(Int_t)(iFiber/11) - phi0-(iFiber%11)*2.*TMath::ATan(fiberRadius/dShift);
    Float_t xp  = dShift*TMath::Cos(phi);
    Float_t yp  = dShift*TMath::Sin(phi);
    services->AddNode(fiber, iFiber+1, new TGeoTranslation(xp,yp,0 ));
  }

  cageNservices->AddNode(services, 1, new TGeoTranslation(0., 0., 0. ));
  
  vol->AddNode(cageNservices,1,new TGeoTranslation(0., 0., 0. ));
  
  // ------------------- Creating volumes for MFT planes --------------------------------

  Double_t origin[3] = {0};

  for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {

    AliDebug(1, Form("Creating volumes for MFT plane %02d",iPlane));

    AliMFTPlane *plane = fSegmentation->GetPlane(iPlane);

    // --------- support element(s)
    
    origin[0] =  0.5*(plane->GetSupportElement(0)->GetAxis(0)->GetXmax() + plane->GetSupportElement(0)->GetAxis(0)->GetXmin());
    origin[1] =  0.5*(plane->GetSupportElement(0)->GetAxis(1)->GetXmax() + plane->GetSupportElement(0)->GetAxis(1)->GetXmin());
    origin[2] = -0.5*(plane->GetSupportElement(0)->GetAxis(2)->GetXmax() + plane->GetSupportElement(0)->GetAxis(2)->GetXmin());
    TGeoVolume *supportElem = gGeoManager->MakeTube(Form("MFT_plane%02d_support", iPlane), support, 
						    plane->GetRMinSupport(), 
						    plane->GetRMaxSupport(),
						    0.5*(plane->GetSupportElement(0)->GetAxis(2)->GetXmax() - 
							 plane->GetSupportElement(0)->GetAxis(2)->GetXmin()) );
    AliDebug(2, Form("Created vol %s", supportElem->GetName()));
    supportElem->SetLineColor(kCyan-9);
    vol -> AddNode(supportElem, 0, new TGeoTranslation(origin[0], origin[1], origin[2]));

    AliDebug(1, "support elements created!");
    
    // --------- active elements

    for (Int_t iActive=0; iActive<plane->GetNActiveElements(); iActive++) {
      
      Double_t dx = 0.5*TMath::Abs(plane->GetActiveElement(iActive)->GetAxis(0)->GetXmax() - plane->GetActiveElement(iActive)->GetAxis(0)->GetXmin());
      Double_t dy = 0.5*TMath::Abs(plane->GetActiveElement(iActive)->GetAxis(1)->GetXmax() - plane->GetActiveElement(iActive)->GetAxis(1)->GetXmin());
      Double_t dz = 0.5*TMath::Abs(plane->GetActiveElement(iActive)->GetAxis(2)->GetXmax() - plane->GetActiveElement(iActive)->GetAxis(2)->GetXmin());
      dz /= Double_t(fNSlices);

      origin[0] =  0.5*(plane->GetActiveElement(iActive)->GetAxis(0)->GetXmax() + plane->GetActiveElement(iActive)->GetAxis(0)->GetXmin());
      origin[1] =  0.5*(plane->GetActiveElement(iActive)->GetAxis(1)->GetXmax() + plane->GetActiveElement(iActive)->GetAxis(1)->GetXmin());

      for (Int_t iSlice=0; iSlice<fNSlices; iSlice++) {
	origin[2] = -0.5*(plane->GetActiveElement(iActive)->GetAxis(2)->GetXmin() + 2*dz*(iSlice+1) + plane->GetActiveElement(iActive)->GetAxis(2)->GetXmin() + 2*dz*(iSlice) );
	TGeoVolume *activeElem = gGeoManager->MakeBox(Form("MFT_plane%02d_active%03d_slice%02d", iPlane, iActive, iSlice), silicon, dx, dy, dz);
	AliDebug(2, Form("Created vol %s", activeElem->GetName()));
	activeElem->SetLineColor(kGreen);
	vol -> AddNode(activeElem, 0, new TGeoTranslation(origin[0], origin[1], origin[2]));
      }

    }

    AliDebug(1, "active elements created!");

    // --------- readout elements

    for (Int_t iReadout=0; iReadout<plane->GetNReadoutElements(); iReadout++) {
      
      Double_t dx = 0.5*TMath::Abs(plane->GetReadoutElement(iReadout)->GetAxis(0)->GetXmax() - plane->GetReadoutElement(iReadout)->GetAxis(0)->GetXmin());
      Double_t dy = 0.5*TMath::Abs(plane->GetReadoutElement(iReadout)->GetAxis(1)->GetXmax() - plane->GetReadoutElement(iReadout)->GetAxis(1)->GetXmin());
      Double_t dz = 0.5*TMath::Abs(plane->GetReadoutElement(iReadout)->GetAxis(2)->GetXmax() - plane->GetReadoutElement(iReadout)->GetAxis(2)->GetXmin());

      origin[0] =  0.5*(plane->GetReadoutElement(iReadout)->GetAxis(0)->GetXmax() + plane->GetReadoutElement(iReadout)->GetAxis(0)->GetXmin());
      origin[1] =  0.5*(plane->GetReadoutElement(iReadout)->GetAxis(1)->GetXmax() + plane->GetReadoutElement(iReadout)->GetAxis(1)->GetXmin());
      origin[2] = -0.5*(plane->GetReadoutElement(iReadout)->GetAxis(2)->GetXmax() + plane->GetReadoutElement(iReadout)->GetAxis(2)->GetXmin());

      TGeoVolume *readoutElem = gGeoManager->MakeBox(Form("MFT_plane%02d_readout%03d", iPlane, iReadout), readout, dx, dy, dz);
      AliDebug(2, Form("Created vol %s", readoutElem->GetName()));
      readoutElem->SetLineColor(kRed);
      vol -> AddNode(readoutElem, 0, new TGeoTranslation(origin[0], origin[1], origin[2]));
      
    }

    AliDebug(1, "readout elements created!");

  }

  return vol;

}

//====================================================================================================================================================

void AliMFT::Hits2SDigits(){
  
  // Interface method invoked from AliSimulation to create a list of sdigits corresponding to list of hits. Every hit generates one sdigit.

  AliDebug(1,"Start Hits2SDigits.");
  
  if (!fSegmentation) CreateGeometry();
 
  if (!fLoader->TreeH()) fLoader->LoadHits();

  if (!fLoader->TreeS()) {

    for (Int_t iEvt=0;iEvt<fLoader->GetRunLoader()->GetNumberOfEvents(); iEvt++) {

      fLoader->GetRunLoader()->GetEvent(iEvt);
      fLoader->MakeTree("S");
      MakeBranch("S");
      SetTreeAddress();

      AliDebug(1, Form("Event %03d: fLoader->TreeH()->GetEntries() = %2d", iEvt, Int_t(fLoader->TreeH()->GetEntries())));

      for (Int_t iTrack=0; iTrack<fLoader->TreeH()->GetEntries(); iTrack++) {
	fLoader->TreeH()->GetEntry(iTrack);     
	Hits2SDigitsLocal(Hits(), GetSDigitsList(), iTrack);    // convert these hits to a list of sdigits  
      }
      
      fLoader->TreeS()->Fill();
      fLoader->WriteSDigits("OVERWRITE");
      ResetSDigits();

    }
  }

  fLoader->UnloadHits();
  fLoader->UnloadSDigits();

  AliDebug(1,"Stop Hits2SDigits.");
  
}

//====================================================================================================================================================

void AliMFT::Hits2SDigitsLocal(TClonesArray *hits, const TObjArray *pSDig, Int_t track) {

  //  Add sdigits of these hits to the list
  
  AliDebug(1, "Entering Hits2SDigitsLocal");
  
  if (!fSegmentation) CreateGeometry();
  
  TClonesArray *pSDigList[fNMaxPlanes];
  for (Int_t iPlane=0; iPlane<fNMaxPlanes; iPlane++) pSDigList[iPlane] = NULL; 
  for (Int_t iPlane=0; iPlane<fNPlanes;    iPlane++) { 
    pSDigList[iPlane] = (TClonesArray*) (*pSDig)[iPlane];
    AliDebug(1,Form("Entries of pSDigList %3d; plane: %02d,",pSDigList[iPlane]->GetEntries(),iPlane));
    if (!track && pSDigList[iPlane]->GetEntries()!=0) AliErrorClass("Some of sdigits lists is not empty");
  }
  
  for (Int_t iHit=0; iHit<hits->GetEntries(); iHit++) {

    AliMFTHit *hit = (AliMFTHit*) hits->At(iHit);

    // Creating "main digit"

    AliMFTDigit *mainSDigit = new AliMFTDigit();
    mainSDigit->SetEloss(hit->GetEloss());
    mainSDigit->SetDetElemID(hit->GetDetElemID());
    mainSDigit->SetPlane(hit->GetPlane());
    mainSDigit->AddMCLabel(hit->GetTrack()); 

    Int_t xPixel = -1;
    Int_t yPixel = -1;
    if (fSegmentation->Hit2PixelID(hit->X(), hit->Y(), mainSDigit->GetDetElemID(), xPixel, yPixel)) {
      mainSDigit->SetPixID(xPixel, yPixel, 0);
      mainSDigit->SetPixWidth(fSegmentation->GetPixelSizeX(mainSDigit->GetDetElemID()), 
			  fSegmentation->GetPixelSizeY(mainSDigit->GetDetElemID()),
			  fSegmentation->GetPixelSizeZ(mainSDigit->GetDetElemID()));  
      mainSDigit->SetPixCenter(fSegmentation->GetPixelCenterX(mainSDigit->GetDetElemID(), xPixel), 
			   fSegmentation->GetPixelCenterY(mainSDigit->GetDetElemID(), yPixel),
			   fSegmentation->GetPixelCenterZ(mainSDigit->GetDetElemID(), 0));
      new ((*fSideDigits)[fSideDigits->GetEntries()]) AliMFTDigit(*mainSDigit);
      AliDebug(1, Form("Created new sdigit (%f, %f, %f) from hit (%f, %f, %f)",
       		       mainSDigit->GetPixelCenterX(), mainSDigit->GetPixelCenterY(), mainSDigit->GetPixelCenterZ(), hit->X(), hit->Y(), hit->Z()));
    }

    // creating "side digits" to simulate the effect of charge dispersion

    Double_t pi4 = TMath::Pi()/4.;
    for (Int_t iStep=0; iStep<fNStepForChargeDispersion; iStep++) {
      Double_t shift = (iStep+1) * fSingleStepForChargeDispersion;
      for (Int_t iAngle=0; iAngle<8; iAngle++) {
	Double_t shiftX = shift*TMath::Cos(iAngle*pi4);
	Double_t shiftY = shift*TMath::Sin(iAngle*pi4);
	if (fSegmentation->Hit2PixelID(hit->X()+shiftX, hit->Y()+shiftY, hit->GetDetElemID(), xPixel, yPixel)) {
	  Bool_t digitExists = kFALSE;
	  for (Int_t iSideDigit=0; iSideDigit<fSideDigits->GetEntries(); iSideDigit++) {
	    if (xPixel==((AliMFTDigit*) fSideDigits->At(iSideDigit))->GetPixelX() && 
		yPixel==((AliMFTDigit*) fSideDigits->At(iSideDigit))->GetPixelY()) {
	      digitExists = kTRUE;
	      break;
	    }
	  }
	  if (!digitExists) {
	    AliMFTDigit *sideSDigit = new AliMFTDigit();
	    sideSDigit->SetEloss(0.);
	    sideSDigit->SetDetElemID(hit->GetDetElemID());
	    sideSDigit->SetPlane(hit->GetPlane());
	    sideSDigit->AddMCLabel(hit->GetTrack());
	    sideSDigit->SetPixID(xPixel, yPixel, 0);
	    sideSDigit->SetPixWidth(fSegmentation->GetPixelSizeX(sideSDigit->GetDetElemID()), 
				    fSegmentation->GetPixelSizeY(sideSDigit->GetDetElemID()),
				    fSegmentation->GetPixelSizeZ(sideSDigit->GetDetElemID()));  
	    sideSDigit->SetPixCenter(fSegmentation->GetPixelCenterX(sideSDigit->GetDetElemID(), xPixel), 
				     fSegmentation->GetPixelCenterY(sideSDigit->GetDetElemID(), yPixel),
				     fSegmentation->GetPixelCenterZ(sideSDigit->GetDetElemID(), 0)); 
	    new ((*fSideDigits)[fSideDigits->GetEntries()]) AliMFTDigit(*sideSDigit);
	  }
	}
      }
    }
    
    // ------------ In case we should simulate a rectangular pattern of pixel...
    
    if (fSegmentation->GetPlane(mainSDigit->GetPlane())->HasPixelRectangularPatternAlongY()) {
      for (Int_t iSDigit=0; iSDigit<fSideDigits->GetEntries(); iSDigit++) {
	AliMFTDigit *mySDig = (AliMFTDigit*) (fSideDigits->At(iSDigit));
	if (mySDig->GetPixelX()%2 == mySDig->GetPixelY()%2) {   // both pair or both odd
	  xPixel = mySDig->GetPixelX();
	  yPixel = mySDig->GetPixelY()+1;
	  if (fSegmentation->DoesPixelExist(mySDig->GetDetElemID(), xPixel, yPixel)) {
	    AliMFTDigit *newSDigit = new AliMFTDigit();
	    newSDigit->SetEloss(0.);
	    newSDigit->SetDetElemID(mySDig->GetDetElemID());
	    newSDigit->SetPlane(mySDig->GetDetElemID());
	    newSDigit->SetPixID(xPixel, yPixel, 0);
	    newSDigit->SetPixWidth(fSegmentation->GetPixelSizeX(newSDigit->GetDetElemID()), 
				   fSegmentation->GetPixelSizeY(newSDigit->GetDetElemID()),
				   fSegmentation->GetPixelSizeZ(newSDigit->GetDetElemID()));  
	    newSDigit->SetPixCenter(fSegmentation->GetPixelCenterX(newSDigit->GetDetElemID(), xPixel), 
				    fSegmentation->GetPixelCenterY(newSDigit->GetDetElemID(), yPixel),
				    fSegmentation->GetPixelCenterZ(newSDigit->GetDetElemID(), 0)); 
	    new ((*fSideDigits)[fSideDigits->GetEntries()]) AliMFTDigit(*newSDigit);
	  }
	}
	else {   // pair-odd
	  xPixel = mySDig->GetPixelX();
	  yPixel = mySDig->GetPixelY()-1;
	  if (fSegmentation->DoesPixelExist(mySDig->GetDetElemID(), xPixel, yPixel)) {
	    AliMFTDigit *newSDigit = new AliMFTDigit();
	    newSDigit->SetEloss(0.);
	    newSDigit->SetDetElemID(mySDig->GetDetElemID());
	    newSDigit->SetPlane(mySDig->GetPlane());
	    newSDigit->SetPixID(xPixel, yPixel, 0);
	    newSDigit->SetPixWidth(fSegmentation->GetPixelSizeX(newSDigit->GetDetElemID()), 
				   fSegmentation->GetPixelSizeY(newSDigit->GetDetElemID()),
				   fSegmentation->GetPixelSizeZ(newSDigit->GetDetElemID()));  
	    newSDigit->SetPixCenter(fSegmentation->GetPixelCenterX(newSDigit->GetDetElemID(), xPixel), 
				    fSegmentation->GetPixelCenterY(newSDigit->GetDetElemID(), yPixel),
				    fSegmentation->GetPixelCenterZ(newSDigit->GetDetElemID(), 0)); 
	    new ((*fSideDigits)[fSideDigits->GetEntries()]) AliMFTDigit(*newSDigit);
	  }
	}
      }
    }

    // -------- checking which pixels switched on have their diode actually within the charge dispersion radius

    for (Int_t iSDigit=0; iSDigit<fSideDigits->GetEntries(); iSDigit++) {
      AliMFTDigit *mySDig = (AliMFTDigit*) (fSideDigits->At(iSDigit));
      Double_t distance = TMath::Sqrt(TMath::Power(mySDig->GetPixelCenterX()-hit->X(),2) + TMath::Power(mySDig->GetPixelCenterY()-hit->Y(),2));
      if (fSegmentation->GetPlane(mySDig->GetPlane())->HasPixelRectangularPatternAlongY()) {
	if (mySDig->GetPixelX()%2 == mySDig->GetPixelY()%2) {  // both pair or both odd
	  if (distance<fChargeDispersion) {
	    AliDebug(1, Form("Created new sdigit (%f, %f, %f) from hit (%f, %f, %f)",
			     mySDig->GetPixelCenterX(), mySDig->GetPixelCenterY(), mySDig->GetPixelCenterZ(), hit->X(), hit->Y(), hit->Z()));
	    new ((*pSDigList[mySDig->GetPlane()])[pSDigList[mySDig->GetPlane()]->GetEntries()]) AliMFTDigit(*mySDig);
	    xPixel = mySDig->GetPixelX();
	    yPixel = mySDig->GetPixelY()+1;
	    if (fSegmentation->DoesPixelExist(mySDig->GetDetElemID(), xPixel, yPixel)) {
	      AliMFTDigit *newSDigit = new AliMFTDigit();
	      newSDigit->SetEloss(0.);
	      newSDigit->SetDetElemID(mySDig->GetDetElemID());
	      newSDigit->SetPlane(mySDig->GetPlane());
	      newSDigit->SetPixID(xPixel, yPixel, 0);
	      newSDigit->SetPixWidth(fSegmentation->GetPixelSizeX(newSDigit->GetDetElemID()), 
				     fSegmentation->GetPixelSizeY(newSDigit->GetDetElemID()),
				     fSegmentation->GetPixelSizeZ(newSDigit->GetDetElemID()));  
	      newSDigit->SetPixCenter(fSegmentation->GetPixelCenterX(newSDigit->GetDetElemID(), xPixel), 
				      fSegmentation->GetPixelCenterY(newSDigit->GetDetElemID(), yPixel),
				      fSegmentation->GetPixelCenterZ(newSDigit->GetDetElemID(), 0));
	      AliDebug(1, Form("Created new sdigit (%f, %f, %f) from hit (%f, %f, %f)",
			       newSDigit->GetPixelCenterX(), newSDigit->GetPixelCenterY(), newSDigit->GetPixelCenterZ(), hit->X(), hit->Y(), hit->Z()));
	      new ((*pSDigList[newSDigit->GetPlane()])[pSDigList[newSDigit->GetPlane()]->GetEntries()]) AliMFTDigit(*newSDigit);
	    }
	  }
	}
      }
      else {
	if (distance<fChargeDispersion) {
	  AliDebug(1, Form("Created new sdigit (%f, %f, %f) from hit (%f, %f, %f)",
			   mySDig->GetPixelCenterX(), mySDig->GetPixelCenterY(), mySDig->GetPixelCenterZ(), hit->X(), hit->Y(), hit->Z()));
	  new ((*pSDigList[mySDig->GetPlane()])[pSDigList[mySDig->GetPlane()]->GetEntries()]) AliMFTDigit(*mySDig);
	}
      }
    }

    fSideDigits->Delete(); 

  }

  AliDebug(1,"Exiting Hits2SDigitsLocal");

}

//====================================================================================================================================================

void AliMFT::MakeBranch(Option_t *option) {

  // Create Tree branches 
  AliDebug(1, Form("Start with option= %s.",option));
  
  const Int_t kBufSize = 4000;
  
  const Char_t *cH = strstr(option,"H");
  const Char_t *cD = strstr(option,"D");
  const Char_t *cS = strstr(option,"S");

  if (cH && fLoader->TreeH()) {
    CreateHits();
    MakeBranchInTree(fLoader->TreeH(), "MFT", &fHits, kBufSize, 0);   
  }

  if (cS && fLoader->TreeS()) {
    CreateSDigits();
    for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) MakeBranchInTree(fLoader->TreeS(), 
								    Form("Plane_%02d",iPlane), 
								    &((*fSDigitsPerPlane)[iPlane]), 
								    kBufSize, 0);
  }
  
  if (cD && fLoader->TreeD()) {
    CreateDigits();
    for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) MakeBranchInTree(fLoader->TreeD(), 
								    Form("Plane_%02d",iPlane), 
								    &((*fDigitsPerPlane)[iPlane]),
								    kBufSize, 0);
  }

  AliDebug(1,"Stop.");

}

//====================================================================================================================================================

void AliMFT::SetTreeAddress() {

  AliDebug(1, "AliMFT::SetTreeAddress()");

  //Set branch address for the Hits and Digits Tree.
  AliDebug(1, "Start.");

  AliDebug(1, Form("AliMFT::SetTreeAddress Hits  fLoader->TreeH() = %p\n", fLoader->TreeH()));
  if (fLoader->TreeH() && fLoader->TreeH()->GetBranch("MFT")) {
    CreateHits();
    fLoader->TreeH()->SetBranchAddress("MFT", &fHits);
  }
    
  AliDebug(1, Form("AliMFT::SetTreeAddress SDigits  fLoader->TreeS() = %p\n", fLoader->TreeS()));
  if (fLoader->TreeS() && fLoader->TreeS()->GetBranch("Plane_00")) {
    CreateSDigits();
    for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
      fLoader->TreeS()->SetBranchAddress(Form("Plane_%02d",iPlane), &((*fSDigitsPerPlane)[iPlane]));
    }
  }
    
  AliDebug(1, Form("AliMFT::SetTreeAddress Digits  fLoader->TreeD() = %p\n", fLoader->TreeD()));
  if (fLoader->TreeD() && fLoader->TreeD()->GetBranch("Plane_00")) {
    CreateDigits(); 
    for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
      fLoader->TreeD()->SetBranchAddress(Form("Plane_%02d",iPlane), &((*fDigitsPerPlane)[iPlane]));
    }
  }

  AliDebug(1, Form("AliMFT::SetTreeAddress RecPoints  fLoader->TreeR() = %p\n", fLoader->TreeR()));
  if (fLoader->TreeR() && fLoader->TreeR()->GetBranch("Plane_00")) {
    CreateRecPoints(); 
    for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
      fLoader->TreeR()->SetBranchAddress(Form("Plane_%02d",iPlane), &((*fRecPointsPerPlane)[iPlane]));
    }
  }

  AliDebug(1,"Stop.");

}

//====================================================================================================================================================

void AliMFT::SetGeometry() {

  AliInfo("AliMFT::SetGeometry\n");

  fSegmentation = new AliMFTSegmentation(fNameGeomFile.Data());

  fNPlanes = fSegmentation->GetNPlanes();

}

//====================================================================================================================================================

void AliMFT::CreateHits() { 

  // create array of hits

  AliDebug(1, "AliMFT::CreateHits()");

  if (fHits) return;    
  fHits = new TClonesArray("AliMFTHit");  

}

//====================================================================================================================================================

void AliMFT::CreateSDigits() { 
 
  // create sdigits list

  AliDebug(1, "AliMFT::CreateSDigits()");
 
  if (fSDigitsPerPlane) return; 
  fSDigitsPerPlane = new TObjArray(fNPlanes); 
  for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) fSDigitsPerPlane->AddAt(new TClonesArray("AliMFTDigit"), iPlane);

  fSideDigits = new TClonesArray("AliMFTDigit");

}

//====================================================================================================================================================

void AliMFT::CreateDigits() {

  // create digits list

  AliDebug(1, "AliMFT::CreateDigits()");

  if (fDigitsPerPlane) return; 
  fDigitsPerPlane = new TObjArray(fNPlanes);
  for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) fDigitsPerPlane->AddAt(new TClonesArray("AliMFTDigit"), iPlane);

}

//====================================================================================================================================================

void AliMFT::CreateRecPoints() {

  // create recPoints list

  AliDebug(1, "AliMFT::CreateRecPoints()");

  if (fRecPointsPerPlane) return; 
  fRecPointsPerPlane = new TObjArray(fNPlanes);
  for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) fRecPointsPerPlane->AddAt(new TClonesArray("AliMFTCluster"), iPlane);

}

//====================================================================================================================================================
 AliMFT.cxx:1
 AliMFT.cxx:2
 AliMFT.cxx:3
 AliMFT.cxx:4
 AliMFT.cxx:5
 AliMFT.cxx:6
 AliMFT.cxx:7
 AliMFT.cxx:8
 AliMFT.cxx:9
 AliMFT.cxx:10
 AliMFT.cxx:11
 AliMFT.cxx:12
 AliMFT.cxx:13
 AliMFT.cxx:14
 AliMFT.cxx:15
 AliMFT.cxx:16
 AliMFT.cxx:17
 AliMFT.cxx:18
 AliMFT.cxx:19
 AliMFT.cxx:20
 AliMFT.cxx:21
 AliMFT.cxx:22
 AliMFT.cxx:23
 AliMFT.cxx:24
 AliMFT.cxx:25
 AliMFT.cxx:26
 AliMFT.cxx:27
 AliMFT.cxx:28
 AliMFT.cxx:29
 AliMFT.cxx:30
 AliMFT.cxx:31
 AliMFT.cxx:32
 AliMFT.cxx:33
 AliMFT.cxx:34
 AliMFT.cxx:35
 AliMFT.cxx:36
 AliMFT.cxx:37
 AliMFT.cxx:38
 AliMFT.cxx:39
 AliMFT.cxx:40
 AliMFT.cxx:41
 AliMFT.cxx:42
 AliMFT.cxx:43
 AliMFT.cxx:44
 AliMFT.cxx:45
 AliMFT.cxx:46
 AliMFT.cxx:47
 AliMFT.cxx:48
 AliMFT.cxx:49
 AliMFT.cxx:50
 AliMFT.cxx:51
 AliMFT.cxx:52
 AliMFT.cxx:53
 AliMFT.cxx:54
 AliMFT.cxx:55
 AliMFT.cxx:56
 AliMFT.cxx:57
 AliMFT.cxx:58
 AliMFT.cxx:59
 AliMFT.cxx:60
 AliMFT.cxx:61
 AliMFT.cxx:62
 AliMFT.cxx:63
 AliMFT.cxx:64
 AliMFT.cxx:65
 AliMFT.cxx:66
 AliMFT.cxx:67
 AliMFT.cxx:68
 AliMFT.cxx:69
 AliMFT.cxx:70
 AliMFT.cxx:71
 AliMFT.cxx:72
 AliMFT.cxx:73
 AliMFT.cxx:74
 AliMFT.cxx:75
 AliMFT.cxx:76
 AliMFT.cxx:77
 AliMFT.cxx:78
 AliMFT.cxx:79
 AliMFT.cxx:80
 AliMFT.cxx:81
 AliMFT.cxx:82
 AliMFT.cxx:83
 AliMFT.cxx:84
 AliMFT.cxx:85
 AliMFT.cxx:86
 AliMFT.cxx:87
 AliMFT.cxx:88
 AliMFT.cxx:89
 AliMFT.cxx:90
 AliMFT.cxx:91
 AliMFT.cxx:92
 AliMFT.cxx:93
 AliMFT.cxx:94
 AliMFT.cxx:95
 AliMFT.cxx:96
 AliMFT.cxx:97
 AliMFT.cxx:98
 AliMFT.cxx:99
 AliMFT.cxx:100
 AliMFT.cxx:101
 AliMFT.cxx:102
 AliMFT.cxx:103
 AliMFT.cxx:104
 AliMFT.cxx:105
 AliMFT.cxx:106
 AliMFT.cxx:107
 AliMFT.cxx:108
 AliMFT.cxx:109
 AliMFT.cxx:110
 AliMFT.cxx:111
 AliMFT.cxx:112
 AliMFT.cxx:113
 AliMFT.cxx:114
 AliMFT.cxx:115
 AliMFT.cxx:116
 AliMFT.cxx:117
 AliMFT.cxx:118
 AliMFT.cxx:119
 AliMFT.cxx:120
 AliMFT.cxx:121
 AliMFT.cxx:122
 AliMFT.cxx:123
 AliMFT.cxx:124
 AliMFT.cxx:125
 AliMFT.cxx:126
 AliMFT.cxx:127
 AliMFT.cxx:128
 AliMFT.cxx:129
 AliMFT.cxx:130
 AliMFT.cxx:131
 AliMFT.cxx:132
 AliMFT.cxx:133
 AliMFT.cxx:134
 AliMFT.cxx:135
 AliMFT.cxx:136
 AliMFT.cxx:137
 AliMFT.cxx:138
 AliMFT.cxx:139
 AliMFT.cxx:140
 AliMFT.cxx:141
 AliMFT.cxx:142
 AliMFT.cxx:143
 AliMFT.cxx:144
 AliMFT.cxx:145
 AliMFT.cxx:146
 AliMFT.cxx:147
 AliMFT.cxx:148
 AliMFT.cxx:149
 AliMFT.cxx:150
 AliMFT.cxx:151
 AliMFT.cxx:152
 AliMFT.cxx:153
 AliMFT.cxx:154
 AliMFT.cxx:155
 AliMFT.cxx:156
 AliMFT.cxx:157
 AliMFT.cxx:158
 AliMFT.cxx:159
 AliMFT.cxx:160
 AliMFT.cxx:161
 AliMFT.cxx:162
 AliMFT.cxx:163
 AliMFT.cxx:164
 AliMFT.cxx:165
 AliMFT.cxx:166
 AliMFT.cxx:167
 AliMFT.cxx:168
 AliMFT.cxx:169
 AliMFT.cxx:170
 AliMFT.cxx:171
 AliMFT.cxx:172
 AliMFT.cxx:173
 AliMFT.cxx:174
 AliMFT.cxx:175
 AliMFT.cxx:176
 AliMFT.cxx:177
 AliMFT.cxx:178
 AliMFT.cxx:179
 AliMFT.cxx:180
 AliMFT.cxx:181
 AliMFT.cxx:182
 AliMFT.cxx:183
 AliMFT.cxx:184
 AliMFT.cxx:185
 AliMFT.cxx:186
 AliMFT.cxx:187
 AliMFT.cxx:188
 AliMFT.cxx:189
 AliMFT.cxx:190
 AliMFT.cxx:191
 AliMFT.cxx:192
 AliMFT.cxx:193
 AliMFT.cxx:194
 AliMFT.cxx:195
 AliMFT.cxx:196
 AliMFT.cxx:197
 AliMFT.cxx:198
 AliMFT.cxx:199
 AliMFT.cxx:200
 AliMFT.cxx:201
 AliMFT.cxx:202
 AliMFT.cxx:203
 AliMFT.cxx:204
 AliMFT.cxx:205
 AliMFT.cxx:206
 AliMFT.cxx:207
 AliMFT.cxx:208
 AliMFT.cxx:209
 AliMFT.cxx:210
 AliMFT.cxx:211
 AliMFT.cxx:212
 AliMFT.cxx:213
 AliMFT.cxx:214
 AliMFT.cxx:215
 AliMFT.cxx:216
 AliMFT.cxx:217
 AliMFT.cxx:218
 AliMFT.cxx:219
 AliMFT.cxx:220
 AliMFT.cxx:221
 AliMFT.cxx:222
 AliMFT.cxx:223
 AliMFT.cxx:224
 AliMFT.cxx:225
 AliMFT.cxx:226
 AliMFT.cxx:227
 AliMFT.cxx:228
 AliMFT.cxx:229
 AliMFT.cxx:230
 AliMFT.cxx:231
 AliMFT.cxx:232
 AliMFT.cxx:233
 AliMFT.cxx:234
 AliMFT.cxx:235
 AliMFT.cxx:236
 AliMFT.cxx:237
 AliMFT.cxx:238
 AliMFT.cxx:239
 AliMFT.cxx:240
 AliMFT.cxx:241
 AliMFT.cxx:242
 AliMFT.cxx:243
 AliMFT.cxx:244
 AliMFT.cxx:245
 AliMFT.cxx:246
 AliMFT.cxx:247
 AliMFT.cxx:248
 AliMFT.cxx:249
 AliMFT.cxx:250
 AliMFT.cxx:251
 AliMFT.cxx:252
 AliMFT.cxx:253
 AliMFT.cxx:254
 AliMFT.cxx:255
 AliMFT.cxx:256
 AliMFT.cxx:257
 AliMFT.cxx:258
 AliMFT.cxx:259
 AliMFT.cxx:260
 AliMFT.cxx:261
 AliMFT.cxx:262
 AliMFT.cxx:263
 AliMFT.cxx:264
 AliMFT.cxx:265
 AliMFT.cxx:266
 AliMFT.cxx:267
 AliMFT.cxx:268
 AliMFT.cxx:269
 AliMFT.cxx:270
 AliMFT.cxx:271
 AliMFT.cxx:272
 AliMFT.cxx:273
 AliMFT.cxx:274
 AliMFT.cxx:275
 AliMFT.cxx:276
 AliMFT.cxx:277
 AliMFT.cxx:278
 AliMFT.cxx:279
 AliMFT.cxx:280
 AliMFT.cxx:281
 AliMFT.cxx:282
 AliMFT.cxx:283
 AliMFT.cxx:284
 AliMFT.cxx:285
 AliMFT.cxx:286
 AliMFT.cxx:287
 AliMFT.cxx:288
 AliMFT.cxx:289
 AliMFT.cxx:290
 AliMFT.cxx:291
 AliMFT.cxx:292
 AliMFT.cxx:293
 AliMFT.cxx:294
 AliMFT.cxx:295
 AliMFT.cxx:296
 AliMFT.cxx:297
 AliMFT.cxx:298
 AliMFT.cxx:299
 AliMFT.cxx:300
 AliMFT.cxx:301
 AliMFT.cxx:302
 AliMFT.cxx:303
 AliMFT.cxx:304
 AliMFT.cxx:305
 AliMFT.cxx:306
 AliMFT.cxx:307
 AliMFT.cxx:308
 AliMFT.cxx:309
 AliMFT.cxx:310
 AliMFT.cxx:311
 AliMFT.cxx:312
 AliMFT.cxx:313
 AliMFT.cxx:314
 AliMFT.cxx:315
 AliMFT.cxx:316
 AliMFT.cxx:317
 AliMFT.cxx:318
 AliMFT.cxx:319
 AliMFT.cxx:320
 AliMFT.cxx:321
 AliMFT.cxx:322
 AliMFT.cxx:323
 AliMFT.cxx:324
 AliMFT.cxx:325
 AliMFT.cxx:326
 AliMFT.cxx:327
 AliMFT.cxx:328
 AliMFT.cxx:329
 AliMFT.cxx:330
 AliMFT.cxx:331
 AliMFT.cxx:332
 AliMFT.cxx:333
 AliMFT.cxx:334
 AliMFT.cxx:335
 AliMFT.cxx:336
 AliMFT.cxx:337
 AliMFT.cxx:338
 AliMFT.cxx:339
 AliMFT.cxx:340
 AliMFT.cxx:341
 AliMFT.cxx:342
 AliMFT.cxx:343
 AliMFT.cxx:344
 AliMFT.cxx:345
 AliMFT.cxx:346
 AliMFT.cxx:347
 AliMFT.cxx:348
 AliMFT.cxx:349
 AliMFT.cxx:350
 AliMFT.cxx:351
 AliMFT.cxx:352
 AliMFT.cxx:353
 AliMFT.cxx:354
 AliMFT.cxx:355
 AliMFT.cxx:356
 AliMFT.cxx:357
 AliMFT.cxx:358
 AliMFT.cxx:359
 AliMFT.cxx:360
 AliMFT.cxx:361
 AliMFT.cxx:362
 AliMFT.cxx:363
 AliMFT.cxx:364
 AliMFT.cxx:365
 AliMFT.cxx:366
 AliMFT.cxx:367
 AliMFT.cxx:368
 AliMFT.cxx:369
 AliMFT.cxx:370
 AliMFT.cxx:371
 AliMFT.cxx:372
 AliMFT.cxx:373
 AliMFT.cxx:374
 AliMFT.cxx:375
 AliMFT.cxx:376
 AliMFT.cxx:377
 AliMFT.cxx:378
 AliMFT.cxx:379
 AliMFT.cxx:380
 AliMFT.cxx:381
 AliMFT.cxx:382
 AliMFT.cxx:383
 AliMFT.cxx:384
 AliMFT.cxx:385
 AliMFT.cxx:386
 AliMFT.cxx:387
 AliMFT.cxx:388
 AliMFT.cxx:389
 AliMFT.cxx:390
 AliMFT.cxx:391
 AliMFT.cxx:392
 AliMFT.cxx:393
 AliMFT.cxx:394
 AliMFT.cxx:395
 AliMFT.cxx:396
 AliMFT.cxx:397
 AliMFT.cxx:398
 AliMFT.cxx:399
 AliMFT.cxx:400
 AliMFT.cxx:401
 AliMFT.cxx:402
 AliMFT.cxx:403
 AliMFT.cxx:404
 AliMFT.cxx:405
 AliMFT.cxx:406
 AliMFT.cxx:407
 AliMFT.cxx:408
 AliMFT.cxx:409
 AliMFT.cxx:410
 AliMFT.cxx:411
 AliMFT.cxx:412
 AliMFT.cxx:413
 AliMFT.cxx:414
 AliMFT.cxx:415
 AliMFT.cxx:416
 AliMFT.cxx:417
 AliMFT.cxx:418
 AliMFT.cxx:419
 AliMFT.cxx:420
 AliMFT.cxx:421
 AliMFT.cxx:422
 AliMFT.cxx:423
 AliMFT.cxx:424
 AliMFT.cxx:425
 AliMFT.cxx:426
 AliMFT.cxx:427
 AliMFT.cxx:428
 AliMFT.cxx:429
 AliMFT.cxx:430
 AliMFT.cxx:431
 AliMFT.cxx:432
 AliMFT.cxx:433
 AliMFT.cxx:434
 AliMFT.cxx:435
 AliMFT.cxx:436
 AliMFT.cxx:437
 AliMFT.cxx:438
 AliMFT.cxx:439
 AliMFT.cxx:440
 AliMFT.cxx:441
 AliMFT.cxx:442
 AliMFT.cxx:443
 AliMFT.cxx:444
 AliMFT.cxx:445
 AliMFT.cxx:446
 AliMFT.cxx:447
 AliMFT.cxx:448
 AliMFT.cxx:449
 AliMFT.cxx:450
 AliMFT.cxx:451
 AliMFT.cxx:452
 AliMFT.cxx:453
 AliMFT.cxx:454
 AliMFT.cxx:455
 AliMFT.cxx:456
 AliMFT.cxx:457
 AliMFT.cxx:458
 AliMFT.cxx:459
 AliMFT.cxx:460
 AliMFT.cxx:461
 AliMFT.cxx:462
 AliMFT.cxx:463
 AliMFT.cxx:464
 AliMFT.cxx:465
 AliMFT.cxx:466
 AliMFT.cxx:467
 AliMFT.cxx:468
 AliMFT.cxx:469
 AliMFT.cxx:470
 AliMFT.cxx:471
 AliMFT.cxx:472
 AliMFT.cxx:473
 AliMFT.cxx:474
 AliMFT.cxx:475
 AliMFT.cxx:476
 AliMFT.cxx:477
 AliMFT.cxx:478
 AliMFT.cxx:479
 AliMFT.cxx:480
 AliMFT.cxx:481
 AliMFT.cxx:482
 AliMFT.cxx:483
 AliMFT.cxx:484
 AliMFT.cxx:485
 AliMFT.cxx:486
 AliMFT.cxx:487
 AliMFT.cxx:488
 AliMFT.cxx:489
 AliMFT.cxx:490
 AliMFT.cxx:491
 AliMFT.cxx:492
 AliMFT.cxx:493
 AliMFT.cxx:494
 AliMFT.cxx:495
 AliMFT.cxx:496
 AliMFT.cxx:497
 AliMFT.cxx:498
 AliMFT.cxx:499
 AliMFT.cxx:500
 AliMFT.cxx:501
 AliMFT.cxx:502
 AliMFT.cxx:503
 AliMFT.cxx:504
 AliMFT.cxx:505
 AliMFT.cxx:506
 AliMFT.cxx:507
 AliMFT.cxx:508
 AliMFT.cxx:509
 AliMFT.cxx:510
 AliMFT.cxx:511
 AliMFT.cxx:512
 AliMFT.cxx:513
 AliMFT.cxx:514
 AliMFT.cxx:515
 AliMFT.cxx:516
 AliMFT.cxx:517
 AliMFT.cxx:518
 AliMFT.cxx:519
 AliMFT.cxx:520
 AliMFT.cxx:521
 AliMFT.cxx:522
 AliMFT.cxx:523
 AliMFT.cxx:524
 AliMFT.cxx:525
 AliMFT.cxx:526
 AliMFT.cxx:527
 AliMFT.cxx:528
 AliMFT.cxx:529
 AliMFT.cxx:530
 AliMFT.cxx:531
 AliMFT.cxx:532
 AliMFT.cxx:533
 AliMFT.cxx:534
 AliMFT.cxx:535
 AliMFT.cxx:536
 AliMFT.cxx:537
 AliMFT.cxx:538
 AliMFT.cxx:539
 AliMFT.cxx:540
 AliMFT.cxx:541
 AliMFT.cxx:542
 AliMFT.cxx:543
 AliMFT.cxx:544
 AliMFT.cxx:545
 AliMFT.cxx:546
 AliMFT.cxx:547
 AliMFT.cxx:548
 AliMFT.cxx:549
 AliMFT.cxx:550
 AliMFT.cxx:551
 AliMFT.cxx:552
 AliMFT.cxx:553
 AliMFT.cxx:554
 AliMFT.cxx:555
 AliMFT.cxx:556
 AliMFT.cxx:557
 AliMFT.cxx:558
 AliMFT.cxx:559
 AliMFT.cxx:560
 AliMFT.cxx:561
 AliMFT.cxx:562
 AliMFT.cxx:563
 AliMFT.cxx:564
 AliMFT.cxx:565
 AliMFT.cxx:566
 AliMFT.cxx:567
 AliMFT.cxx:568
 AliMFT.cxx:569
 AliMFT.cxx:570
 AliMFT.cxx:571
 AliMFT.cxx:572
 AliMFT.cxx:573
 AliMFT.cxx:574
 AliMFT.cxx:575
 AliMFT.cxx:576
 AliMFT.cxx:577
 AliMFT.cxx:578
 AliMFT.cxx:579
 AliMFT.cxx:580
 AliMFT.cxx:581
 AliMFT.cxx:582
 AliMFT.cxx:583
 AliMFT.cxx:584
 AliMFT.cxx:585
 AliMFT.cxx:586
 AliMFT.cxx:587
 AliMFT.cxx:588
 AliMFT.cxx:589
 AliMFT.cxx:590
 AliMFT.cxx:591
 AliMFT.cxx:592
 AliMFT.cxx:593
 AliMFT.cxx:594
 AliMFT.cxx:595
 AliMFT.cxx:596
 AliMFT.cxx:597
 AliMFT.cxx:598
 AliMFT.cxx:599
 AliMFT.cxx:600
 AliMFT.cxx:601
 AliMFT.cxx:602
 AliMFT.cxx:603
 AliMFT.cxx:604
 AliMFT.cxx:605
 AliMFT.cxx:606
 AliMFT.cxx:607
 AliMFT.cxx:608
 AliMFT.cxx:609
 AliMFT.cxx:610
 AliMFT.cxx:611
 AliMFT.cxx:612
 AliMFT.cxx:613
 AliMFT.cxx:614
 AliMFT.cxx:615
 AliMFT.cxx:616
 AliMFT.cxx:617
 AliMFT.cxx:618
 AliMFT.cxx:619
 AliMFT.cxx:620
 AliMFT.cxx:621
 AliMFT.cxx:622
 AliMFT.cxx:623
 AliMFT.cxx:624
 AliMFT.cxx:625
 AliMFT.cxx:626
 AliMFT.cxx:627
 AliMFT.cxx:628
 AliMFT.cxx:629
 AliMFT.cxx:630
 AliMFT.cxx:631
 AliMFT.cxx:632
 AliMFT.cxx:633
 AliMFT.cxx:634
 AliMFT.cxx:635
 AliMFT.cxx:636
 AliMFT.cxx:637
 AliMFT.cxx:638
 AliMFT.cxx:639
 AliMFT.cxx:640
 AliMFT.cxx:641
 AliMFT.cxx:642
 AliMFT.cxx:643
 AliMFT.cxx:644
 AliMFT.cxx:645
 AliMFT.cxx:646
 AliMFT.cxx:647
 AliMFT.cxx:648
 AliMFT.cxx:649
 AliMFT.cxx:650
 AliMFT.cxx:651
 AliMFT.cxx:652
 AliMFT.cxx:653
 AliMFT.cxx:654
 AliMFT.cxx:655
 AliMFT.cxx:656
 AliMFT.cxx:657
 AliMFT.cxx:658
 AliMFT.cxx:659
 AliMFT.cxx:660
 AliMFT.cxx:661
 AliMFT.cxx:662
 AliMFT.cxx:663
 AliMFT.cxx:664
 AliMFT.cxx:665
 AliMFT.cxx:666
 AliMFT.cxx:667
 AliMFT.cxx:668
 AliMFT.cxx:669
 AliMFT.cxx:670
 AliMFT.cxx:671
 AliMFT.cxx:672
 AliMFT.cxx:673
 AliMFT.cxx:674
 AliMFT.cxx:675
 AliMFT.cxx:676
 AliMFT.cxx:677
 AliMFT.cxx:678
 AliMFT.cxx:679
 AliMFT.cxx:680
 AliMFT.cxx:681
 AliMFT.cxx:682
 AliMFT.cxx:683
 AliMFT.cxx:684
 AliMFT.cxx:685
 AliMFT.cxx:686
 AliMFT.cxx:687
 AliMFT.cxx:688
 AliMFT.cxx:689
 AliMFT.cxx:690
 AliMFT.cxx:691
 AliMFT.cxx:692
 AliMFT.cxx:693
 AliMFT.cxx:694
 AliMFT.cxx:695
 AliMFT.cxx:696
 AliMFT.cxx:697
 AliMFT.cxx:698
 AliMFT.cxx:699
 AliMFT.cxx:700
 AliMFT.cxx:701
 AliMFT.cxx:702
 AliMFT.cxx:703
 AliMFT.cxx:704
 AliMFT.cxx:705
 AliMFT.cxx:706
 AliMFT.cxx:707
 AliMFT.cxx:708
 AliMFT.cxx:709
 AliMFT.cxx:710
 AliMFT.cxx:711
 AliMFT.cxx:712
 AliMFT.cxx:713
 AliMFT.cxx:714
 AliMFT.cxx:715
 AliMFT.cxx:716
 AliMFT.cxx:717
 AliMFT.cxx:718
 AliMFT.cxx:719
 AliMFT.cxx:720
 AliMFT.cxx:721
 AliMFT.cxx:722
 AliMFT.cxx:723
 AliMFT.cxx:724
 AliMFT.cxx:725
 AliMFT.cxx:726
 AliMFT.cxx:727
 AliMFT.cxx:728
 AliMFT.cxx:729
 AliMFT.cxx:730
 AliMFT.cxx:731
 AliMFT.cxx:732
 AliMFT.cxx:733
 AliMFT.cxx:734
 AliMFT.cxx:735
 AliMFT.cxx:736
 AliMFT.cxx:737
 AliMFT.cxx:738
 AliMFT.cxx:739
 AliMFT.cxx:740
 AliMFT.cxx:741
 AliMFT.cxx:742
 AliMFT.cxx:743
 AliMFT.cxx:744
 AliMFT.cxx:745
 AliMFT.cxx:746
 AliMFT.cxx:747
 AliMFT.cxx:748
 AliMFT.cxx:749
 AliMFT.cxx:750
 AliMFT.cxx:751
 AliMFT.cxx:752
 AliMFT.cxx:753
 AliMFT.cxx:754
 AliMFT.cxx:755
 AliMFT.cxx:756
 AliMFT.cxx:757
 AliMFT.cxx:758
 AliMFT.cxx:759
 AliMFT.cxx:760
 AliMFT.cxx:761
 AliMFT.cxx:762
 AliMFT.cxx:763
 AliMFT.cxx:764
 AliMFT.cxx:765
 AliMFT.cxx:766
 AliMFT.cxx:767
 AliMFT.cxx:768
 AliMFT.cxx:769
 AliMFT.cxx:770
 AliMFT.cxx:771
 AliMFT.cxx:772
 AliMFT.cxx:773
 AliMFT.cxx:774
 AliMFT.cxx:775
 AliMFT.cxx:776
 AliMFT.cxx:777
 AliMFT.cxx:778
 AliMFT.cxx:779
 AliMFT.cxx:780
 AliMFT.cxx:781
 AliMFT.cxx:782
 AliMFT.cxx:783
 AliMFT.cxx:784
 AliMFT.cxx:785
 AliMFT.cxx:786
 AliMFT.cxx:787
 AliMFT.cxx:788
 AliMFT.cxx:789
 AliMFT.cxx:790
 AliMFT.cxx:791
 AliMFT.cxx:792
 AliMFT.cxx:793
 AliMFT.cxx:794
 AliMFT.cxx:795
 AliMFT.cxx:796
 AliMFT.cxx:797
 AliMFT.cxx:798
 AliMFT.cxx:799
 AliMFT.cxx:800
 AliMFT.cxx:801
 AliMFT.cxx:802
 AliMFT.cxx:803
 AliMFT.cxx:804
 AliMFT.cxx:805
 AliMFT.cxx:806
 AliMFT.cxx:807
 AliMFT.cxx:808
 AliMFT.cxx:809
 AliMFT.cxx:810
 AliMFT.cxx:811
 AliMFT.cxx:812
 AliMFT.cxx:813
 AliMFT.cxx:814
 AliMFT.cxx:815
 AliMFT.cxx:816
 AliMFT.cxx:817
 AliMFT.cxx:818
 AliMFT.cxx:819
 AliMFT.cxx:820
 AliMFT.cxx:821
 AliMFT.cxx:822
 AliMFT.cxx:823
 AliMFT.cxx:824
 AliMFT.cxx:825
 AliMFT.cxx:826
 AliMFT.cxx:827
 AliMFT.cxx:828
 AliMFT.cxx:829
 AliMFT.cxx:830
 AliMFT.cxx:831
 AliMFT.cxx:832
 AliMFT.cxx:833
 AliMFT.cxx:834
 AliMFT.cxx:835
 AliMFT.cxx:836
 AliMFT.cxx:837
 AliMFT.cxx:838
 AliMFT.cxx:839
 AliMFT.cxx:840
 AliMFT.cxx:841
 AliMFT.cxx:842
 AliMFT.cxx:843
 AliMFT.cxx:844
 AliMFT.cxx:845
 AliMFT.cxx:846
 AliMFT.cxx:847
 AliMFT.cxx:848
 AliMFT.cxx:849
 AliMFT.cxx:850
 AliMFT.cxx:851
 AliMFT.cxx:852
 AliMFT.cxx:853
 AliMFT.cxx:854
 AliMFT.cxx:855
 AliMFT.cxx:856
 AliMFT.cxx:857
 AliMFT.cxx:858
 AliMFT.cxx:859
 AliMFT.cxx:860
 AliMFT.cxx:861
 AliMFT.cxx:862
 AliMFT.cxx:863
 AliMFT.cxx:864
 AliMFT.cxx:865
 AliMFT.cxx:866
 AliMFT.cxx:867
 AliMFT.cxx:868
 AliMFT.cxx:869
 AliMFT.cxx:870
 AliMFT.cxx:871
 AliMFT.cxx:872
 AliMFT.cxx:873
 AliMFT.cxx:874
 AliMFT.cxx:875
 AliMFT.cxx:876
 AliMFT.cxx:877
 AliMFT.cxx:878
 AliMFT.cxx:879
 AliMFT.cxx:880
 AliMFT.cxx:881
 AliMFT.cxx:882
 AliMFT.cxx:883
 AliMFT.cxx:884
 AliMFT.cxx:885
 AliMFT.cxx:886
 AliMFT.cxx:887
 AliMFT.cxx:888
 AliMFT.cxx:889
 AliMFT.cxx:890
 AliMFT.cxx:891
 AliMFT.cxx:892
 AliMFT.cxx:893
 AliMFT.cxx:894
 AliMFT.cxx:895
 AliMFT.cxx:896
 AliMFT.cxx:897
 AliMFT.cxx:898
 AliMFT.cxx:899
 AliMFT.cxx:900
 AliMFT.cxx:901
 AliMFT.cxx:902
 AliMFT.cxx:903
 AliMFT.cxx:904