ROOT logo
#ifndef AliMFT_H
#define AliMFT_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//====================================================================================================================================================
//
//      Geometry of the Muon Forward Tracker based on TGeo
//
//      Contact author: antonio.uras@cern.ch
//
//====================================================================================================================================================

#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 "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"
#include "AliMFTConstants.h"

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

class AliMFT : public AliDetector  {

public:

  AliMFT();
  AliMFT(const Char_t *name, const Char_t *title);
  AliMFT(const Char_t *name, const Char_t *title, Char_t *nameGeomFile);

  virtual ~AliMFT();

  Int_t IsVersion() const { return fVersion; }
  
  // ------- framework part -----------------------------------------------------------------------------------
  void CreateMaterials();                       // from AliModule invoked from AliMC
  void CreateGeometry();                        // from AliModule invoked from AliMC
  void AddAlignableVolumes();                     
  void StepManager();                           // from AliModule invoked from AliMC::Stepping()
  void Hits2SDigits();
  void Hits2SDigitsLocal(TClonesArray *hits, const TObjArray *pSDig, Int_t track);
  void MakeBranch(Option_t *option="");
  void SetTreeAddress();
          
  // ------- create containers -----------------------------------------------------------------------------------
  void CreateHits();
  void CreateSDigits();
  void CreateDigits();
  void CreateRecPoints();

  TObjArray*    GetSDigitsList()            const { return fSDigitsPerPlane; }     // get sdigits list for all planes
  TClonesArray* GetSDigitsList(Int_t plane) const { return fSDigitsPerPlane ? (TClonesArray*) fSDigitsPerPlane->At(plane):0; } 

  TObjArray*    GetDigitsList()            const{return fDigitsPerPlane;}          // get digits list for all layers
  TClonesArray* GetDigitsList(Int_t plane) const{return fDigitsPerPlane ? (TClonesArray*) fDigitsPerPlane->At(plane):0; }

  TObjArray*    GetRecPointsList()            const{return fRecPointsPerPlane;}    // get cluster list for all layers
  TClonesArray* GetRecPointsList(Int_t plane) const{return fRecPointsPerPlane ? (TClonesArray*) fRecPointsPerPlane->At(plane):0; }

  void ResetSDigits()   { if(fSDigitsPerPlane)   for(int iPlane=0; iPlane<fNPlanes; iPlane++) ((TClonesArray*) fSDigitsPerPlane  ->At(iPlane))->Clear(); }   // reset sdigits list  
  void ResetDigits()    { if(fDigitsPerPlane)    for(int iPlane=0; iPlane<fNPlanes; iPlane++) ((TClonesArray*) fDigitsPerPlane   ->At(iPlane))->Clear(); }   // reset digits list
  void ResetRecPoints() { if(fRecPointsPerPlane) for(int iPlane=0; iPlane<fNPlanes; iPlane++) ((TClonesArray*) fRecPointsPerPlane->At(iPlane))->Clear(); }   // reset recPoints list
  
  AliDigitizer* CreateDigitizer(AliDigitizationInput *digInp) const { return new AliMFTDigitizer(digInp); }
  
  AliMFTSegmentation* GetSegmentation() const { return fSegmentation; }

  enum EMedia{kAir, kSi, kReadout, kSupport, kCarbon, kAlu, kWater, kSiO2, kInox};  // media IDs used in CreateMaterials
    
  // Geometry/segmentation creation part
  TGeoVolumeAssembly* CreateVol();
  void AddAlignableVolumes() const { /* not needed */ return; }
  void SetGeometry();

  void  SetNSlices(Int_t nSlices) { fNSlices = nSlices; }
  Int_t GetNSlices() const { return fNSlices; }

  Int_t GetNPlanes() const { return fNPlanes; }

  void SetChargeDispersion(Double_t chargeDispersion) { fChargeDispersion = chargeDispersion; }
  Double_t GetChargeDispersion() { return fChargeDispersion; }
  void SetNStepForChargeDispersion(Int_t nStepForChargeDispersion) { fNStepForChargeDispersion = nStepForChargeDispersion; }
  Int_t GetNStepForChargeDispersion() { return fNStepForChargeDispersion; }
  Double_t GetSingleStepForChargeDispersion() { return fSingleStepForChargeDispersion; }

  void SetDensitySupportOverSi(Double_t density) { if (density>1e-6) fDensitySupportOverSi=density; else fDensitySupportOverSi=1e-6; }

  //--------- for underlying and pile-up events --------------------

  void SetFileNameForUnderlyingEvent(TString fileName) { if (fileName.EndsWith("MFT.RecPoints.root")) fFileNameForUnderyingEvent += fileName; }
  void SetFileNameForPileUpEvents(TString fileName)    { if (fileName.EndsWith("MFT.RecPoints.root")) fFileNameForPileUpEvents   += fileName; }

  void SetUnderlyingEventID(Short_t eventID) { fUnderlyingEventID = eventID; }
  void SetPileUpEventID(Short_t i, Short_t eventID) { if (i>=0 && i<AliMFTConstants::fNMaxPileUpEvents) fPileUpEventsIDs[i] = eventID; }

  const Char_t* GetFileNameForUnderlyingEvent() { return fFileNameForUnderyingEvent; }
  const Char_t* GetFileNameForPileUpEvents()    { return fFileNameForPileUpEvents; }
  Short_t GetUnderlyingEventID() { return fUnderlyingEventID; }
  Short_t GetPileUpEventID(Short_t i) { if (i>=0 && i<AliMFTConstants::fNMaxPileUpEvents) return fPileUpEventsIDs[i]; else return -1; }
  
protected:

  static const Int_t fNMaxPlanes = AliMFTConstants::fNMaxPlanes;        // max number of MFT planes

  Int_t fVersion;

  Int_t fNPlanes;                             // # of MFT planes
  Int_t fNSlices;                             // # of slices per MFT plane
  
  TObjArray *fSDigitsPerPlane;                // ![fNPlanes] list of sdigits [per plane]
  TObjArray *fDigitsPerPlane;                 // ![fNPlanes] list of digits [per plane]
  TObjArray *fRecPointsPerPlane;              // ![fNPlanes] list of recPoints [per plane]
  TClonesArray *fSideDigits;                  // ! list of digits fired by the charge dispersion coming from the main hit

  AliMFTSegmentation *fSegmentation;

  TString fNameGeomFile;

  Double_t fChargeDispersion;
  Double_t fSingleStepForChargeDispersion;
  Int_t fNStepForChargeDispersion;

  Double_t fDensitySupportOverSi;

  TString fFileNameForUnderyingEvent, fFileNameForPileUpEvents;
  Short_t fNPileUpEvents, fUnderlyingEventID, fPileUpEventsIDs[AliMFTConstants::fNMaxPileUpEvents];
  
private:

  AliMFT (const AliMFT& mft);             // dummy copy constructor
  AliMFT &operator=(const AliMFT& mft);   // dummy assignment operator
  
  ClassDef(AliMFT,2) 
    
};

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

#endif

 AliMFT.h:1
 AliMFT.h:2
 AliMFT.h:3
 AliMFT.h:4
 AliMFT.h:5
 AliMFT.h:6
 AliMFT.h:7
 AliMFT.h:8
 AliMFT.h:9
 AliMFT.h:10
 AliMFT.h:11
 AliMFT.h:12
 AliMFT.h:13
 AliMFT.h:14
 AliMFT.h:15
 AliMFT.h:16
 AliMFT.h:17
 AliMFT.h:18
 AliMFT.h:19
 AliMFT.h:20
 AliMFT.h:21
 AliMFT.h:22
 AliMFT.h:23
 AliMFT.h:24
 AliMFT.h:25
 AliMFT.h:26
 AliMFT.h:27
 AliMFT.h:28
 AliMFT.h:29
 AliMFT.h:30
 AliMFT.h:31
 AliMFT.h:32
 AliMFT.h:33
 AliMFT.h:34
 AliMFT.h:35
 AliMFT.h:36
 AliMFT.h:37
 AliMFT.h:38
 AliMFT.h:39
 AliMFT.h:40
 AliMFT.h:41
 AliMFT.h:42
 AliMFT.h:43
 AliMFT.h:44
 AliMFT.h:45
 AliMFT.h:46
 AliMFT.h:47
 AliMFT.h:48
 AliMFT.h:49
 AliMFT.h:50
 AliMFT.h:51
 AliMFT.h:52
 AliMFT.h:53
 AliMFT.h:54
 AliMFT.h:55
 AliMFT.h:56
 AliMFT.h:57
 AliMFT.h:58
 AliMFT.h:59
 AliMFT.h:60
 AliMFT.h:61
 AliMFT.h:62
 AliMFT.h:63
 AliMFT.h:64
 AliMFT.h:65
 AliMFT.h:66
 AliMFT.h:67
 AliMFT.h:68
 AliMFT.h:69
 AliMFT.h:70
 AliMFT.h:71
 AliMFT.h:72
 AliMFT.h:73
 AliMFT.h:74
 AliMFT.h:75
 AliMFT.h:76
 AliMFT.h:77
 AliMFT.h:78
 AliMFT.h:79
 AliMFT.h:80
 AliMFT.h:81
 AliMFT.h:82
 AliMFT.h:83
 AliMFT.h:84
 AliMFT.h:85
 AliMFT.h:86
 AliMFT.h:87
 AliMFT.h:88
 AliMFT.h:89
 AliMFT.h:90
 AliMFT.h:91
 AliMFT.h:92
 AliMFT.h:93
 AliMFT.h:94
 AliMFT.h:95
 AliMFT.h:96
 AliMFT.h:97
 AliMFT.h:98
 AliMFT.h:99
 AliMFT.h:100
 AliMFT.h:101
 AliMFT.h:102
 AliMFT.h:103
 AliMFT.h:104
 AliMFT.h:105
 AliMFT.h:106
 AliMFT.h:107
 AliMFT.h:108
 AliMFT.h:109
 AliMFT.h:110
 AliMFT.h:111
 AliMFT.h:112
 AliMFT.h:113
 AliMFT.h:114
 AliMFT.h:115
 AliMFT.h:116
 AliMFT.h:117
 AliMFT.h:118
 AliMFT.h:119
 AliMFT.h:120
 AliMFT.h:121
 AliMFT.h:122
 AliMFT.h:123
 AliMFT.h:124
 AliMFT.h:125
 AliMFT.h:126
 AliMFT.h:127
 AliMFT.h:128
 AliMFT.h:129
 AliMFT.h:130
 AliMFT.h:131
 AliMFT.h:132
 AliMFT.h:133
 AliMFT.h:134
 AliMFT.h:135
 AliMFT.h:136
 AliMFT.h:137
 AliMFT.h:138
 AliMFT.h:139
 AliMFT.h:140
 AliMFT.h:141
 AliMFT.h:142
 AliMFT.h:143
 AliMFT.h:144
 AliMFT.h:145
 AliMFT.h:146
 AliMFT.h:147
 AliMFT.h:148
 AliMFT.h:149
 AliMFT.h:150
 AliMFT.h:151
 AliMFT.h:152
 AliMFT.h:153
 AliMFT.h:154
 AliMFT.h:155
 AliMFT.h:156
 AliMFT.h:157