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

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

#include "TFile.h"
#include "TNtuple.h"
#include "TClonesArray.h"
#include "TMath.h"
#include "AliMFTPlane.h"
#include "AliMFTSegmentation.h"

ClassImp(AliMFTSegmentation)

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

AliMFTSegmentation::AliMFTSegmentation(): 
  TObject(),
  fMFTPlanes(0)
{ 

  // default constructor

}

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

AliMFTSegmentation::AliMFTSegmentation(const Char_t *nameGeomFile): 
  TObject(),
  fMFTPlanes(0x0)
{ 
  
  // constructor
  
  fMFTPlanes = new TClonesArray("AliMFTPlane", fNMaxPlanes);
  fMFTPlanes -> SetOwner(kTRUE);
  Float_t zCenter, rMin, rMax, pixelSizeX, pixelSizeY, thicknessActive, thicknessSupport, thicknessReadout;
  Float_t equivalentSilicon, equivalentSiliconBeforeFront, equivalentSiliconBeforeBack, hasPixelRectangularPatternAlongY;

  TFile *geomFile = new TFile(nameGeomFile);
  TNtuple *geomNtuple = (TNtuple*) geomFile->Get("AliMFTGeometry");

  geomNtuple -> SetBranchAddress("zCenter", &zCenter);
  geomNtuple -> SetBranchAddress("rMin",    &rMin);
  geomNtuple -> SetBranchAddress("rMax",    &rMax);
  geomNtuple -> SetBranchAddress("pixelSizeX", &pixelSizeX);
  geomNtuple -> SetBranchAddress("pixelSizeY", &pixelSizeY);
  geomNtuple -> SetBranchAddress("thicknessActive",  &thicknessActive);
  geomNtuple -> SetBranchAddress("thicknessSupport", &thicknessSupport);
  geomNtuple -> SetBranchAddress("thicknessReadout", &thicknessReadout);
  geomNtuple -> SetBranchAddress("equivalentSilicon",            &equivalentSilicon);
  geomNtuple -> SetBranchAddress("equivalentSiliconBeforeFront", &equivalentSiliconBeforeFront);
  geomNtuple -> SetBranchAddress("equivalentSiliconBeforeBack",  &equivalentSiliconBeforeBack);
  if (geomNtuple -> GetBranch("hasPixelRectangularPatternAlongY")) {
    geomNtuple -> SetBranchAddress("hasPixelRectangularPatternAlongY", &hasPixelRectangularPatternAlongY);
  }
  else hasPixelRectangularPatternAlongY = 0.;
  
  Int_t nPlanes = geomNtuple->GetEntries();

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

    // Create new plane

    AliInfo(Form("Setting segmentation for MFT plane #%02d\n", iPlane));

    geomNtuple -> GetEntry(iPlane);
    zCenter = TMath::Abs(zCenter);

    AliMFTPlane *plane = new AliMFTPlane(Form("MFTPlane_%02d", iPlane), Form("MFTPlane_%02d", iPlane));

    plane -> Init(iPlane, 
		  zCenter, 
		  rMin, 
		  rMax, 
		  pixelSizeX, 
		  pixelSizeY, 
		  thicknessActive, 
		  thicknessSupport, 
		  thicknessReadout, 
		  (hasPixelRectangularPatternAlongY>0.5));

    plane -> SetEquivalentSilicon(equivalentSilicon);
    plane -> SetEquivalentSiliconBeforeFront(equivalentSiliconBeforeFront);
    plane -> SetEquivalentSiliconBeforeBack(equivalentSiliconBeforeBack);
    plane -> CreateStructure();
    
    new ((*fMFTPlanes)[fMFTPlanes->GetEntries()]) AliMFTPlane(*plane);
    delete plane;
    
  }
  
  delete geomFile;

  AliInfo("MFT segmentation set!\n");

}

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

AliMFTSegmentation::~AliMFTSegmentation() {

  if (fMFTPlanes) fMFTPlanes->Delete();
  delete fMFTPlanes; 
  
}

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

void AliMFTSegmentation::Clear(const Option_t* /*opt*/) {

  if (fMFTPlanes) fMFTPlanes->Delete();
  delete fMFTPlanes; 
  fMFTPlanes = NULL;
  
}

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

THnSparseC* AliMFTSegmentation::GetDetElem(Int_t detElemID) const {
      
  // Find det elem

  Int_t planeNb = detElemID/fNMaxDetElemPerPlane;
  Int_t detElemNb = detElemID - planeNb*fNMaxDetElemPerPlane;
  
  THnSparseC *detElem = GetPlane(planeNb)->GetActiveElement(detElemNb);

  return detElem;

}

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

Bool_t AliMFTSegmentation::Hit2PixelID(Double_t xHit, Double_t yHit, Int_t detElemID, Int_t &xPixel, Int_t &yPixel) {

  // xPixel and yPixel start from 0

  THnSparseC *detElem = GetDetElem(detElemID);

  if ( xHit<detElem->GetAxis(0)->GetXmin() ||
       xHit>detElem->GetAxis(0)->GetXmax() ||
       yHit<detElem->GetAxis(1)->GetXmin() ||
       yHit>detElem->GetAxis(1)->GetXmax() ) return kFALSE;

  xPixel = detElem->GetAxis(0)->FindBin(xHit) - 1;
  yPixel = detElem->GetAxis(1)->FindBin(yHit) - 1;

  return kTRUE;

}

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

Bool_t AliMFTSegmentation::DoesPixelExist(Int_t detElemID, Int_t xPixel, Int_t yPixel) {

  THnSparseC *detElem = GetDetElem(detElemID);

  if (xPixel>=0 && xPixel<detElem->GetAxis(0)->GetNbins() && yPixel>=0 && yPixel<detElem->GetAxis(1)->GetNbins()) return kTRUE;
  else return kFALSE;

}

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