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

/* $Id: AliITSUReconstructor.cxx 58442 2012-09-04 17:17:06Z masera $ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// class for ITS reconstruction                                              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "Riostream.h"
#include "AliITSUReconstructor.h"
#include "AliITSURecoDet.h"
#include "AliRun.h"
#include "AliRawReader.h"
#include "AliESDEvent.h"

#include "AliTracker.h"
#include "AliITSUTrackerCooked.h"
#include "AliITSUCATracker.h"

#include "AliITSUGeomTGeo.h"
#include "AliITSUSegmentationPix.h"
#include "AliITSUDigitPix.h"
#include "AliITSUClusterizer.h"
#include "AliITSUClusterPix.h"
#include "AliITSUVertexer.h"
#include "AliMagF.h"

ClassImp(AliITSUReconstructor)

//___________________________________________________________________________
AliITSUReconstructor::AliITSUReconstructor() 
:  AliReconstructor()
  ,fGeom(0)
  ,fITS(0)
  ,fClusterFinders(0)
  ,fClusters(0)
{
  // Default constructor

}

//___________________________________________________________________________
AliITSUReconstructor::~AliITSUReconstructor()
{
  // destructor
  //
  if (!fGeom) return; // was not initialized
  //
  // same cluster finders and recpoint arrays might be attached to different layers
  for (int i=fGeom->GetNLayers();i--;) {
    TObject* clFinder = fClusterFinders.At(i);
    if (clFinder) {
      while (fClusterFinders.Remove(clFinder)) {}
      delete clFinder;
    }
    //
    delete fClusters[i];
  }
  delete[] fClusters;
  //
  delete fITS;
  delete fGeom;
} 

//______________________________________________________________________
void AliITSUReconstructor::Init() 
{
  // Initalize this reconstructor 
  // Note: fITS cannot be initialized here since it requires RecoParams (not available ar
  // the moment of reconstructors initialization)
  //
  AliInfo("Initializing");
  if (fGeom) AliFatal("was already done, something is wrong...");
  //
  fGeom = new AliITSUGeomTGeo(kTRUE,kTRUE);
  AliITSUClusterPix::SetGeom(fGeom);
  //  
  AliITSUClusterizer* clusPIX = 0;
  fClusters = new TClonesArray*[fGeom->GetNLayers()];
  //
  for (int ilr=fGeom->GetNLayers();ilr--;) {
    fClusters[ilr] = 0;
    int tpDet = fGeom->GetLayerChipTypeID(ilr)/AliITSUGeomTGeo::kMaxSegmPerChipType;
    if (tpDet == AliITSUGeomTGeo::kChipTypePix) {
      if (!clusPIX)    clusPIX    = new AliITSUClusterizer();
      fClusterFinders.AddAtAndExpand(clusPIX, ilr);
      fClusters[ilr] = new TClonesArray(AliITSUClusterPix::Class());
      //
      // to expand the buffers to max.size
      clusPIX->SetSegmentation((AliITSUSegmentationPix*)fGeom->GetSegmentation(ilr)); 
      continue;
    }
    else {
      AliFatal(Form("ClusterFinder for detector type %d is not defined",tpDet));
    }
  }
  //
  return;
}

//_____________________________________________________________________________
void AliITSUReconstructor::Reconstruct(TTree *digitsTree, TTree *clustersTree) const
{
  // reconstruct clusters. If clustersTree is provided, write the tree
  if (!digitsTree) return;
  AliDebug(1,"ITSU Cluster finder (from digits tree) is initiated here \n");
  //
  // At the moment only pixel digits
  TClonesArray *digArrPix = 0;
  digitsTree->SetBranchAddress("ITSDigitsPix",&digArrPix);
  //
  // a new tree is created for each event: add each layer as separate branch
  TBranch *lrBranch[fGeom->GetNLayers()];
  //
  for (int ilr=0;ilr<fGeom->GetNLayers();ilr++) {
    lrBranch[ilr] = 0;
    if (clustersTree) { // do we write clusters tree?
      int tp = fGeom->GetLayerChipTypeID(ilr)/AliITSUGeomTGeo::kMaxSegmPerChipType;
      if (tp==AliITSUGeomTGeo::kChipTypePix) {
	lrBranch[ilr] = clustersTree->Bronch(Form("ITSRecPoints%d",ilr),"TClonesArray",&fClusters[ilr]);
      }
      else {
	AliFatal(Form("Detector type %d is not defined",tp));
      }
    }
  }
  //
  AliITSUClusterizer* clFinder = 0;
  AliMagF* field = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
  double bz = 0;
  if (field == 0) AliError("Cannot get magnetic field from TGeoGlobalMagField");
  else bz = field->SolenoidField();
  const AliITSURecoParam* recPar = GetRecoParam();
  //
  for (int ilr=0;ilr<fGeom->GetNLayers();ilr++) {
    //
    fClusters[ilr]->Clear();
    clFinder = (AliITSUClusterizer*)fClusterFinders[ilr];
    clFinder->SetSegmentation((AliITSUSegmentationPix*)fGeom->GetSegmentation(ilr));
    clFinder->SetLayerID(ilr);
    clFinder->SetClusters(fClusters[ilr]);
    clFinder->SetRecoParam(recPar); // RS: Do we need to set it for every event?
    clFinder->SetAllowDiagonalClusterization(recPar->GetAllowDiagonalClusterization(ilr));
    clFinder->PrepareLorentzAngleCorrection(bz);
    //
    int modF=fGeom->GetFirstChipIndex(ilr);
    int modL=fGeom->GetLastChipIndex(ilr)+1;
    for (int imod=modF;imod<modL;imod++) {
      digitsTree->GetEntry(imod);   
      int ndig  = digArrPix->GetEntries();
      if (!ndig) continue;
      clFinder->SetVolID(imod);
      clFinder->SetDigits(digArrPix);
      clFinder->Clusterize();
    }
    //
    //    AliITSUClusterPix::SetSortMode( AliITSUClusterPix::SortModeIdTrkYZ());
    //    fClusters[ilr]->Sort();
    AliDebug(1,Form(" -> Lr%d : %d Cluster",ilr,fClusters[ilr]->GetEntries()));
    if (clustersTree) lrBranch[ilr]->Fill();
  }
  if (clustersTree) clustersTree->SetEntries();
  //
}

//_____________________________________________________________________________
AliTracker* AliITSUReconstructor::CreateTracker() const
{
  // create a ITS tracker
  Int_t opt = GetRecoParam()->GetTracker();
  Bool_t sa = GetRecoParam()->GetSAonly();

  Info("CreateTracker","Creating the ITSU tracker %d in mode %d",opt,sa);

  AliTracker *tracker=0;
  switch (opt) {
  case 0:
     tracker = new AliITSUTrackerGlo((AliITSUReconstructor*)this);
     break;
  case 1:
     tracker = new AliITSUTrackerCooked((AliITSUReconstructor*)this);
     ((AliITSUTrackerCooked*)tracker)->SetSAonly(sa);
     break;
  case 2:
     tracker = new AliITSUCATracker((AliITSUReconstructor*)this);
     ((AliITSUCATracker*)tracker)->SetSAonly(sa);
     break;
  default:
     AliFatal("Undefined ITSU tracker type !");
  }
 
  return tracker;
 
}

//_____________________________________________________________________________
AliVertexer* AliITSUReconstructor::CreateVertexer() const
{
  // create a ITS vertexer
  // 
  AliInfo("Creating vertexer using tracklets with the first 3 ITS layers");

  if (GetRecoParam()->GetEventSpecie() & AliRecoParam::kHighMult) {
    return new AliITSUVertexer();
  } else {
    return new AliITSUVertexer(0.05,0.003,0.04,0.8,3);
  }
}

//_____________________________________________________________________________
AliTrackleter* AliITSUReconstructor::CreateMultFinder() const
{
  // create the SPD trackeleter for mult. reconstruction
  // to be implemented for the upgrade

  AliDebug(1,"ITSU MultFinder  should be initiated here\n");
  return 0;

}

//_____________________________________________________________________________
AliTracker* AliITSUReconstructor::CreateTrackleter() const
{
  // create the SPD trackeleter (for SPD PlaneEfficiency evaluation)
  // to be implemented for the upgrade

  AliDebug(1,"ITSU Trackleter  should be initiated here\n");
  return 0;

}

/*
//_____________________________________________________________________________
Int_t AliITSUReconstructor::LoadClusters(TTree* treeRP) 
{
  // read clusters from the tree, if it is provided
  for (int ilr=fGeom->GetNLayers();ilr--;) {
    if (!fClusters[ilr]) AliFatal(Form("Clusters array for layer %d is not defined",ilr)); 
    TBranch* br = treeRP->GetBranch(Form("ITSRecPoints%d",ilr));
    if (!br) AliFatal(Form("Provided cluster tree does not contain branch for layer %d",ilr));
    br->SetAddress(&fClusters[ilr]);
  }
  treeRP->GetEntry(0); // we are still in 1 ev/tree mode...
  return 1;
}
*/


//_____________________________________________________________________________
AliITSURecoDet* AliITSUReconstructor::GetITSInterface()
{
  // Create reco oriented interface to geometry
  if (fITS) return fITS;
  //
  fITS = new AliITSURecoDet(fGeom,"ITSURecoInterface");
  int nLr = fITS->GetNLayersActive();
  for (int ilr=nLr;ilr--;) fITS->GetLayerActive(ilr)->SetClusters(GetClusters(ilr));
  return fITS;
}
 AliITSUReconstructor.cxx:1
 AliITSUReconstructor.cxx:2
 AliITSUReconstructor.cxx:3
 AliITSUReconstructor.cxx:4
 AliITSUReconstructor.cxx:5
 AliITSUReconstructor.cxx:6
 AliITSUReconstructor.cxx:7
 AliITSUReconstructor.cxx:8
 AliITSUReconstructor.cxx:9
 AliITSUReconstructor.cxx:10
 AliITSUReconstructor.cxx:11
 AliITSUReconstructor.cxx:12
 AliITSUReconstructor.cxx:13
 AliITSUReconstructor.cxx:14
 AliITSUReconstructor.cxx:15
 AliITSUReconstructor.cxx:16
 AliITSUReconstructor.cxx:17
 AliITSUReconstructor.cxx:18
 AliITSUReconstructor.cxx:19
 AliITSUReconstructor.cxx:20
 AliITSUReconstructor.cxx:21
 AliITSUReconstructor.cxx:22
 AliITSUReconstructor.cxx:23
 AliITSUReconstructor.cxx:24
 AliITSUReconstructor.cxx:25
 AliITSUReconstructor.cxx:26
 AliITSUReconstructor.cxx:27
 AliITSUReconstructor.cxx:28
 AliITSUReconstructor.cxx:29
 AliITSUReconstructor.cxx:30
 AliITSUReconstructor.cxx:31
 AliITSUReconstructor.cxx:32
 AliITSUReconstructor.cxx:33
 AliITSUReconstructor.cxx:34
 AliITSUReconstructor.cxx:35
 AliITSUReconstructor.cxx:36
 AliITSUReconstructor.cxx:37
 AliITSUReconstructor.cxx:38
 AliITSUReconstructor.cxx:39
 AliITSUReconstructor.cxx:40
 AliITSUReconstructor.cxx:41
 AliITSUReconstructor.cxx:42
 AliITSUReconstructor.cxx:43
 AliITSUReconstructor.cxx:44
 AliITSUReconstructor.cxx:45
 AliITSUReconstructor.cxx:46
 AliITSUReconstructor.cxx:47
 AliITSUReconstructor.cxx:48
 AliITSUReconstructor.cxx:49
 AliITSUReconstructor.cxx:50
 AliITSUReconstructor.cxx:51
 AliITSUReconstructor.cxx:52
 AliITSUReconstructor.cxx:53
 AliITSUReconstructor.cxx:54
 AliITSUReconstructor.cxx:55
 AliITSUReconstructor.cxx:56
 AliITSUReconstructor.cxx:57
 AliITSUReconstructor.cxx:58
 AliITSUReconstructor.cxx:59
 AliITSUReconstructor.cxx:60
 AliITSUReconstructor.cxx:61
 AliITSUReconstructor.cxx:62
 AliITSUReconstructor.cxx:63
 AliITSUReconstructor.cxx:64
 AliITSUReconstructor.cxx:65
 AliITSUReconstructor.cxx:66
 AliITSUReconstructor.cxx:67
 AliITSUReconstructor.cxx:68
 AliITSUReconstructor.cxx:69
 AliITSUReconstructor.cxx:70
 AliITSUReconstructor.cxx:71
 AliITSUReconstructor.cxx:72
 AliITSUReconstructor.cxx:73
 AliITSUReconstructor.cxx:74
 AliITSUReconstructor.cxx:75
 AliITSUReconstructor.cxx:76
 AliITSUReconstructor.cxx:77
 AliITSUReconstructor.cxx:78
 AliITSUReconstructor.cxx:79
 AliITSUReconstructor.cxx:80
 AliITSUReconstructor.cxx:81
 AliITSUReconstructor.cxx:82
 AliITSUReconstructor.cxx:83
 AliITSUReconstructor.cxx:84
 AliITSUReconstructor.cxx:85
 AliITSUReconstructor.cxx:86
 AliITSUReconstructor.cxx:87
 AliITSUReconstructor.cxx:88
 AliITSUReconstructor.cxx:89
 AliITSUReconstructor.cxx:90
 AliITSUReconstructor.cxx:91
 AliITSUReconstructor.cxx:92
 AliITSUReconstructor.cxx:93
 AliITSUReconstructor.cxx:94
 AliITSUReconstructor.cxx:95
 AliITSUReconstructor.cxx:96
 AliITSUReconstructor.cxx:97
 AliITSUReconstructor.cxx:98
 AliITSUReconstructor.cxx:99
 AliITSUReconstructor.cxx:100
 AliITSUReconstructor.cxx:101
 AliITSUReconstructor.cxx:102
 AliITSUReconstructor.cxx:103
 AliITSUReconstructor.cxx:104
 AliITSUReconstructor.cxx:105
 AliITSUReconstructor.cxx:106
 AliITSUReconstructor.cxx:107
 AliITSUReconstructor.cxx:108
 AliITSUReconstructor.cxx:109
 AliITSUReconstructor.cxx:110
 AliITSUReconstructor.cxx:111
 AliITSUReconstructor.cxx:112
 AliITSUReconstructor.cxx:113
 AliITSUReconstructor.cxx:114
 AliITSUReconstructor.cxx:115
 AliITSUReconstructor.cxx:116
 AliITSUReconstructor.cxx:117
 AliITSUReconstructor.cxx:118
 AliITSUReconstructor.cxx:119
 AliITSUReconstructor.cxx:120
 AliITSUReconstructor.cxx:121
 AliITSUReconstructor.cxx:122
 AliITSUReconstructor.cxx:123
 AliITSUReconstructor.cxx:124
 AliITSUReconstructor.cxx:125
 AliITSUReconstructor.cxx:126
 AliITSUReconstructor.cxx:127
 AliITSUReconstructor.cxx:128
 AliITSUReconstructor.cxx:129
 AliITSUReconstructor.cxx:130
 AliITSUReconstructor.cxx:131
 AliITSUReconstructor.cxx:132
 AliITSUReconstructor.cxx:133
 AliITSUReconstructor.cxx:134
 AliITSUReconstructor.cxx:135
 AliITSUReconstructor.cxx:136
 AliITSUReconstructor.cxx:137
 AliITSUReconstructor.cxx:138
 AliITSUReconstructor.cxx:139
 AliITSUReconstructor.cxx:140
 AliITSUReconstructor.cxx:141
 AliITSUReconstructor.cxx:142
 AliITSUReconstructor.cxx:143
 AliITSUReconstructor.cxx:144
 AliITSUReconstructor.cxx:145
 AliITSUReconstructor.cxx:146
 AliITSUReconstructor.cxx:147
 AliITSUReconstructor.cxx:148
 AliITSUReconstructor.cxx:149
 AliITSUReconstructor.cxx:150
 AliITSUReconstructor.cxx:151
 AliITSUReconstructor.cxx:152
 AliITSUReconstructor.cxx:153
 AliITSUReconstructor.cxx:154
 AliITSUReconstructor.cxx:155
 AliITSUReconstructor.cxx:156
 AliITSUReconstructor.cxx:157
 AliITSUReconstructor.cxx:158
 AliITSUReconstructor.cxx:159
 AliITSUReconstructor.cxx:160
 AliITSUReconstructor.cxx:161
 AliITSUReconstructor.cxx:162
 AliITSUReconstructor.cxx:163
 AliITSUReconstructor.cxx:164
 AliITSUReconstructor.cxx:165
 AliITSUReconstructor.cxx:166
 AliITSUReconstructor.cxx:167
 AliITSUReconstructor.cxx:168
 AliITSUReconstructor.cxx:169
 AliITSUReconstructor.cxx:170
 AliITSUReconstructor.cxx:171
 AliITSUReconstructor.cxx:172
 AliITSUReconstructor.cxx:173
 AliITSUReconstructor.cxx:174
 AliITSUReconstructor.cxx:175
 AliITSUReconstructor.cxx:176
 AliITSUReconstructor.cxx:177
 AliITSUReconstructor.cxx:178
 AliITSUReconstructor.cxx:179
 AliITSUReconstructor.cxx:180
 AliITSUReconstructor.cxx:181
 AliITSUReconstructor.cxx:182
 AliITSUReconstructor.cxx:183
 AliITSUReconstructor.cxx:184
 AliITSUReconstructor.cxx:185
 AliITSUReconstructor.cxx:186
 AliITSUReconstructor.cxx:187
 AliITSUReconstructor.cxx:188
 AliITSUReconstructor.cxx:189
 AliITSUReconstructor.cxx:190
 AliITSUReconstructor.cxx:191
 AliITSUReconstructor.cxx:192
 AliITSUReconstructor.cxx:193
 AliITSUReconstructor.cxx:194
 AliITSUReconstructor.cxx:195
 AliITSUReconstructor.cxx:196
 AliITSUReconstructor.cxx:197
 AliITSUReconstructor.cxx:198
 AliITSUReconstructor.cxx:199
 AliITSUReconstructor.cxx:200
 AliITSUReconstructor.cxx:201
 AliITSUReconstructor.cxx:202
 AliITSUReconstructor.cxx:203
 AliITSUReconstructor.cxx:204
 AliITSUReconstructor.cxx:205
 AliITSUReconstructor.cxx:206
 AliITSUReconstructor.cxx:207
 AliITSUReconstructor.cxx:208
 AliITSUReconstructor.cxx:209
 AliITSUReconstructor.cxx:210
 AliITSUReconstructor.cxx:211
 AliITSUReconstructor.cxx:212
 AliITSUReconstructor.cxx:213
 AliITSUReconstructor.cxx:214
 AliITSUReconstructor.cxx:215
 AliITSUReconstructor.cxx:216
 AliITSUReconstructor.cxx:217
 AliITSUReconstructor.cxx:218
 AliITSUReconstructor.cxx:219
 AliITSUReconstructor.cxx:220
 AliITSUReconstructor.cxx:221
 AliITSUReconstructor.cxx:222
 AliITSUReconstructor.cxx:223
 AliITSUReconstructor.cxx:224
 AliITSUReconstructor.cxx:225
 AliITSUReconstructor.cxx:226
 AliITSUReconstructor.cxx:227
 AliITSUReconstructor.cxx:228
 AliITSUReconstructor.cxx:229
 AliITSUReconstructor.cxx:230
 AliITSUReconstructor.cxx:231
 AliITSUReconstructor.cxx:232
 AliITSUReconstructor.cxx:233
 AliITSUReconstructor.cxx:234
 AliITSUReconstructor.cxx:235
 AliITSUReconstructor.cxx:236
 AliITSUReconstructor.cxx:237
 AliITSUReconstructor.cxx:238
 AliITSUReconstructor.cxx:239
 AliITSUReconstructor.cxx:240
 AliITSUReconstructor.cxx:241
 AliITSUReconstructor.cxx:242
 AliITSUReconstructor.cxx:243
 AliITSUReconstructor.cxx:244
 AliITSUReconstructor.cxx:245
 AliITSUReconstructor.cxx:246
 AliITSUReconstructor.cxx:247
 AliITSUReconstructor.cxx:248
 AliITSUReconstructor.cxx:249
 AliITSUReconstructor.cxx:250
 AliITSUReconstructor.cxx:251
 AliITSUReconstructor.cxx:252
 AliITSUReconstructor.cxx:253
 AliITSUReconstructor.cxx:254
 AliITSUReconstructor.cxx:255
 AliITSUReconstructor.cxx:256
 AliITSUReconstructor.cxx:257
 AliITSUReconstructor.cxx:258
 AliITSUReconstructor.cxx:259
 AliITSUReconstructor.cxx:260
 AliITSUReconstructor.cxx:261
 AliITSUReconstructor.cxx:262
 AliITSUReconstructor.cxx:263
 AliITSUReconstructor.cxx:264
 AliITSUReconstructor.cxx:265
 AliITSUReconstructor.cxx:266
 AliITSUReconstructor.cxx:267
 AliITSUReconstructor.cxx:268
 AliITSUReconstructor.cxx:269
 AliITSUReconstructor.cxx:270
 AliITSUReconstructor.cxx:271
 AliITSUReconstructor.cxx:272
 AliITSUReconstructor.cxx:273
 AliITSUReconstructor.cxx:274