ROOT logo
#include "AliLog.h"
#include "AliMultiplicity.h"
#include "AliITSgeomTGeo.h"
#include "AliITSDetTypeRec.h"
#include "AliITSVertexer.h"
#include "AliITSLoader.h"
#include "AliITSMultReconstructor.h"
#include "AliITSRecPointContainer.h"
#include "AliRunLoader.h"

const Float_t AliITSVertexer::fgkPipeRadius = 3.0;

ClassImp(AliITSVertexer)

//////////////////////////////////////////////////////////////////////
// Base class for primary vertex reconstruction                     //
// AliESDVertexer is a class for full 3D primary vertex finding     //
// derived classes: AliITSvertexer3D, AliITSVertexerZ.              //       
//                  AliITSVertexerCosmics                           //
//////////////////////////////////////////////////////////////////////

/* $Id$ */

//______________________________________________________________________
AliITSVertexer::AliITSVertexer():AliVertexer(),
fLadders(NULL), 
fLadOnLay2(0),
fComputeMultiplicity(kFALSE),
fDetTypeRec(NULL),
fMinTrackletsForPilup(0),
fIsPileup(0),
fNTrpuv(-2),
fZpuv(-9999999.),
fNoVertices(0),
fVertArray(NULL),
fFirstEvent(0),
fLastEvent(-1)
{
  // Default Constructor
  SetLaddersOnLayer2();
  SetMinTrackletsForPilup();
  for(Int_t i=0; i<kNSPDMod;i++) fUseModule[i]=kTRUE;
}

//______________________________________________________________________
AliITSVertexer::~AliITSVertexer() {
  // Destructor
  delete [] fLadders;
  delete []fVertArray;
}

//______________________________________________________________________
void AliITSVertexer::ResetVertex(){
  // Resets vertex related data members
  if(fNoVertices > 0){
    if(fVertArray) delete []fVertArray;
    fVertArray = NULL;
    fNoVertices = 0;
  }
  fIsPileup=kFALSE;
  fNTrpuv=-2;
  fZpuv=-99999.;

}
//______________________________________________________________________
void AliITSVertexer::FindMultiplicity(TTree *itsClusterTree){
  // Invokes AliITSMultReconstructor to determine the
  // charged multiplicity in the pixel layers
  if(fMult){delete fMult; fMult = 0;}

  Bool_t success=kTRUE;
  Bool_t cosmics=kFALSE; 
  if(!fCurrentVertex)success=kFALSE;
  if(fCurrentVertex && fCurrentVertex->GetNContributors()<1)success=kFALSE;
  if(fCurrentVertex && strstr(fCurrentVertex->GetTitle(),"cosmics")) {
    success=kFALSE; 
    cosmics=kTRUE;
  } 

  // get the FastOr bit mask
  TBits fastOrFiredMap = fDetTypeRec->GetFastOrFiredMap();
  TBits firedChipMap = fDetTypeRec->GetFiredChipMap(itsClusterTree);
 
  AliITSMultReconstructor multReco;

  if(!success){
    if(!cosmics) {     
      AliDebug(1,"Tracklets multiplicity not determined because the primary vertex was not found");
      AliDebug(1,"Just counting the number of cluster-fired chips on the SPD layers");
    }
    if (!itsClusterTree) {
      AliError(" Invalid ITS cluster tree !\n");
      return;
    }
    multReco.LoadClusterFiredChips(itsClusterTree);
    Short_t nfcL1 = multReco.GetNFiredChips(0);
    Short_t nfcL2 = multReco.GetNFiredChips(1);
    fMult = new AliMultiplicity(0,0,0,0,0,0,0,0,0,0,0,nfcL1,nfcL2,fastOrFiredMap);
    fMult->SetFiredChipMap(firedChipMap);
    AliITSRecPointContainer* rcont = AliITSRecPointContainer::Instance();
    fMult->SetITSClusters(0,rcont->GetNClustersInLayer(1,itsClusterTree));
    for(Int_t kk=2;kk<=6;kk++){
      fMult->SetITSClusters(kk-1,rcont->GetNClustersInLayerFast(kk));
    }
    return;
  }

  if (!itsClusterTree) {
    AliError(" Invalid ITS cluster tree !\n");
    return;
  }
  Double_t vtx[3];
  fCurrentVertex->GetXYZ(vtx);
  Float_t vtxf[3];
  for(Int_t i=0;i<3;i++)vtxf[i]=vtx[i];
  multReco.SetHistOn(kFALSE);
  multReco.Reconstruct(itsClusterTree,vtxf,vtxf);
  Int_t notracks=multReco.GetNTracklets();
  Float_t *tht = new Float_t [notracks];
  Float_t *phi = new Float_t [notracks];
  Float_t *dtht = new Float_t [notracks];
  Float_t *dphi = new Float_t [notracks];
  Int_t *labels = new Int_t[notracks];
  Int_t *labelsL2 = new Int_t[notracks];
  for(Int_t i=0;i<multReco.GetNTracklets();i++){
    tht[i] = multReco.GetTracklet(i)[0];
    phi[i] =  multReco.GetTracklet(i)[1];
    dtht[i] = multReco.GetTracklet(i)[3];
    dphi[i] = multReco.GetTracklet(i)[2];
    labels[i] = static_cast<Int_t>(multReco.GetTracklet(i)[4]);
    labelsL2[i] = static_cast<Int_t>(multReco.GetTracklet(i)[5]);
  }
  Int_t nosingleclus=multReco.GetNSingleClusters();
  Float_t *ths = new Float_t [nosingleclus];
  Float_t *phs = new Float_t [nosingleclus];
  Int_t *labelss = new Int_t [nosingleclus];
  for(Int_t i=0;i<nosingleclus;i++){
    ths[i] = multReco.GetCluster(i)[0];
    phs[i] = multReco.GetCluster(i)[1];
    labelss[i] = (Int_t)multReco.GetCluster(i)[2];
  }
  Short_t nfcL1 = multReco.GetNFiredChips(0);
  Short_t nfcL2 = multReco.GetNFiredChips(1);
  fMult = new AliMultiplicity(notracks,tht,phi,dtht,dphi,labels,labelsL2,nosingleclus,ths,phs,labelss,nfcL1,nfcL2,fastOrFiredMap);
  fMult->SetFiredChipMap(firedChipMap);
  AliITSRecPointContainer* rcont = AliITSRecPointContainer::Instance();
  fMult->SetITSClusters(0,rcont->GetNClustersInLayer(1,itsClusterTree));
  for(Int_t kk=2;kk<=6;kk++){
    fMult->SetITSClusters(kk-1,rcont->GetNClustersInLayerFast(kk));
  }
  delete [] tht;
  delete [] phi;
  delete [] dtht;
  delete [] dphi;
  delete [] ths;
  delete [] phs;
  delete [] labels;
  delete [] labelsL2;
  delete [] labelss;

  return;
}

//______________________________________________________________________
void AliITSVertexer::SetLaddersOnLayer2(Int_t ladwid){
  // Calculates the array of ladders on layer 2 to be used with a 
  // given ladder on layer 1
  if(ladwid == fLadOnLay2 && fLadders)return;
  fLadOnLay2=ladwid;
  Int_t ladtot1=AliITSgeomTGeo::GetNLadders(1);
  if(fLadders) delete [] fLadders;
  fLadders=new UShort_t[ladtot1];


  Double_t pos1[3],pos2[3];
  Int_t mod1=AliITSgeomTGeo::GetModuleIndex(2,1,1);
  AliITSgeomTGeo::GetTranslation(mod1,pos1);  // position of the module in the MRS 
  Double_t phi0=TMath::ATan2(pos1[1],pos1[0]);
  if(phi0<0) phi0+=2*TMath::Pi();
  Int_t mod2=AliITSgeomTGeo::GetModuleIndex(2,2,1);
  AliITSgeomTGeo::GetTranslation(mod2,pos2);
  Double_t phi2=TMath::ATan2(pos2[1],pos2[0]); 
  if(phi2<0) phi2+=2*TMath::Pi();
  Double_t deltaPhi= phi0-phi2; // phi width of a layer2 module

  for(Int_t i= 0; i<ladtot1;i++){
    Int_t modlad= AliITSgeomTGeo::GetModuleIndex(1,i+1,1);
    Double_t posmod[3];
    AliITSgeomTGeo::GetTranslation(modlad,posmod);
    Double_t phimod=TMath::ATan2(posmod[1],posmod[0]); 
    if(phimod<0) phimod+=2*TMath::Pi();
    Double_t phi1= phimod+deltaPhi*double(fLadOnLay2);
    if(phi1<0) phi1+=2*TMath::Pi();
    if(phi1>2*TMath::Pi()) phi1-=2*TMath::Pi();
    Double_t philad1=phi0-phi1;
    UShort_t lad1;
    Double_t ladder1=(philad1)/(deltaPhi) +1.; 
    if(ladder1<1){ladder1=40+ladder1;}
    lad1=int(ladder1+0.5);
    fLadders[i]=lad1;
  }
}


//______________________________________________________________________
void AliITSVertexer::Init(TString filename){
  // Initialize the vertexer in case of
  // analysis of an entire file
  AliRunLoader *rl = AliRunLoader::Instance();
  if(!rl){
    AliFatal("Run Loader not found");
    return;
  }
  if (fLastEvent < 0) SetLastEvent(rl->GetNumberOfEvents()-1);

  AliITSLoader* itsloader =  (AliITSLoader*) rl->GetLoader("ITSLoader");
  if(!filename.Contains("default"))itsloader->SetVerticesFileName(filename);
  if(!filename.Contains("null"))itsloader->LoadVertices("recreate");
}

//______________________________________________________________________
void AliITSVertexer::WriteCurrentVertex(){
  // Write the current AliVertex object to file fOutFile
  AliRunLoader *rl = AliRunLoader::Instance();
  AliITSLoader* itsLoader =  (AliITSLoader*) rl->GetLoader("ITSLoader");
  fCurrentVertex->SetName("Vertex");
  //  const char * name = fCurrentVertex->GetName();
  //  itsLoader->SetVerticesContName(name);
  itsLoader->PostVertex(fCurrentVertex);
  itsLoader->WriteVertices();
}

//______________________________________________________________________
void AliITSVertexer::FindVertices(){
  // computes the vertices of the events in the range FirstEvent - LastEvent

  AliRunLoader *rl = AliRunLoader::Instance();
  AliITSLoader* itsloader =  (AliITSLoader*) rl->GetLoader("ITSLoader");
  itsloader->LoadRecPoints("read");
  for(Int_t i=fFirstEvent;i<=fLastEvent;i++){
    rl->GetEvent(i);
    TTree* cltree = itsloader->TreeR();
    FindVertexForCurrentEvent(cltree);
    if(fCurrentVertex){
      WriteCurrentVertex();
    }
    else {
      AliDebug(1,Form("Vertex not found for event %d",i));
    }
  }
}
 AliITSVertexer.cxx:1
 AliITSVertexer.cxx:2
 AliITSVertexer.cxx:3
 AliITSVertexer.cxx:4
 AliITSVertexer.cxx:5
 AliITSVertexer.cxx:6
 AliITSVertexer.cxx:7
 AliITSVertexer.cxx:8
 AliITSVertexer.cxx:9
 AliITSVertexer.cxx:10
 AliITSVertexer.cxx:11
 AliITSVertexer.cxx:12
 AliITSVertexer.cxx:13
 AliITSVertexer.cxx:14
 AliITSVertexer.cxx:15
 AliITSVertexer.cxx:16
 AliITSVertexer.cxx:17
 AliITSVertexer.cxx:18
 AliITSVertexer.cxx:19
 AliITSVertexer.cxx:20
 AliITSVertexer.cxx:21
 AliITSVertexer.cxx:22
 AliITSVertexer.cxx:23
 AliITSVertexer.cxx:24
 AliITSVertexer.cxx:25
 AliITSVertexer.cxx:26
 AliITSVertexer.cxx:27
 AliITSVertexer.cxx:28
 AliITSVertexer.cxx:29
 AliITSVertexer.cxx:30
 AliITSVertexer.cxx:31
 AliITSVertexer.cxx:32
 AliITSVertexer.cxx:33
 AliITSVertexer.cxx:34
 AliITSVertexer.cxx:35
 AliITSVertexer.cxx:36
 AliITSVertexer.cxx:37
 AliITSVertexer.cxx:38
 AliITSVertexer.cxx:39
 AliITSVertexer.cxx:40
 AliITSVertexer.cxx:41
 AliITSVertexer.cxx:42
 AliITSVertexer.cxx:43
 AliITSVertexer.cxx:44
 AliITSVertexer.cxx:45
 AliITSVertexer.cxx:46
 AliITSVertexer.cxx:47
 AliITSVertexer.cxx:48
 AliITSVertexer.cxx:49
 AliITSVertexer.cxx:50
 AliITSVertexer.cxx:51
 AliITSVertexer.cxx:52
 AliITSVertexer.cxx:53
 AliITSVertexer.cxx:54
 AliITSVertexer.cxx:55
 AliITSVertexer.cxx:56
 AliITSVertexer.cxx:57
 AliITSVertexer.cxx:58
 AliITSVertexer.cxx:59
 AliITSVertexer.cxx:60
 AliITSVertexer.cxx:61
 AliITSVertexer.cxx:62
 AliITSVertexer.cxx:63
 AliITSVertexer.cxx:64
 AliITSVertexer.cxx:65
 AliITSVertexer.cxx:66
 AliITSVertexer.cxx:67
 AliITSVertexer.cxx:68
 AliITSVertexer.cxx:69
 AliITSVertexer.cxx:70
 AliITSVertexer.cxx:71
 AliITSVertexer.cxx:72
 AliITSVertexer.cxx:73
 AliITSVertexer.cxx:74
 AliITSVertexer.cxx:75
 AliITSVertexer.cxx:76
 AliITSVertexer.cxx:77
 AliITSVertexer.cxx:78
 AliITSVertexer.cxx:79
 AliITSVertexer.cxx:80
 AliITSVertexer.cxx:81
 AliITSVertexer.cxx:82
 AliITSVertexer.cxx:83
 AliITSVertexer.cxx:84
 AliITSVertexer.cxx:85
 AliITSVertexer.cxx:86
 AliITSVertexer.cxx:87
 AliITSVertexer.cxx:88
 AliITSVertexer.cxx:89
 AliITSVertexer.cxx:90
 AliITSVertexer.cxx:91
 AliITSVertexer.cxx:92
 AliITSVertexer.cxx:93
 AliITSVertexer.cxx:94
 AliITSVertexer.cxx:95
 AliITSVertexer.cxx:96
 AliITSVertexer.cxx:97
 AliITSVertexer.cxx:98
 AliITSVertexer.cxx:99
 AliITSVertexer.cxx:100
 AliITSVertexer.cxx:101
 AliITSVertexer.cxx:102
 AliITSVertexer.cxx:103
 AliITSVertexer.cxx:104
 AliITSVertexer.cxx:105
 AliITSVertexer.cxx:106
 AliITSVertexer.cxx:107
 AliITSVertexer.cxx:108
 AliITSVertexer.cxx:109
 AliITSVertexer.cxx:110
 AliITSVertexer.cxx:111
 AliITSVertexer.cxx:112
 AliITSVertexer.cxx:113
 AliITSVertexer.cxx:114
 AliITSVertexer.cxx:115
 AliITSVertexer.cxx:116
 AliITSVertexer.cxx:117
 AliITSVertexer.cxx:118
 AliITSVertexer.cxx:119
 AliITSVertexer.cxx:120
 AliITSVertexer.cxx:121
 AliITSVertexer.cxx:122
 AliITSVertexer.cxx:123
 AliITSVertexer.cxx:124
 AliITSVertexer.cxx:125
 AliITSVertexer.cxx:126
 AliITSVertexer.cxx:127
 AliITSVertexer.cxx:128
 AliITSVertexer.cxx:129
 AliITSVertexer.cxx:130
 AliITSVertexer.cxx:131
 AliITSVertexer.cxx:132
 AliITSVertexer.cxx:133
 AliITSVertexer.cxx:134
 AliITSVertexer.cxx:135
 AliITSVertexer.cxx:136
 AliITSVertexer.cxx:137
 AliITSVertexer.cxx:138
 AliITSVertexer.cxx:139
 AliITSVertexer.cxx:140
 AliITSVertexer.cxx:141
 AliITSVertexer.cxx:142
 AliITSVertexer.cxx:143
 AliITSVertexer.cxx:144
 AliITSVertexer.cxx:145
 AliITSVertexer.cxx:146
 AliITSVertexer.cxx:147
 AliITSVertexer.cxx:148
 AliITSVertexer.cxx:149
 AliITSVertexer.cxx:150
 AliITSVertexer.cxx:151
 AliITSVertexer.cxx:152
 AliITSVertexer.cxx:153
 AliITSVertexer.cxx:154
 AliITSVertexer.cxx:155
 AliITSVertexer.cxx:156
 AliITSVertexer.cxx:157
 AliITSVertexer.cxx:158
 AliITSVertexer.cxx:159
 AliITSVertexer.cxx:160
 AliITSVertexer.cxx:161
 AliITSVertexer.cxx:162
 AliITSVertexer.cxx:163
 AliITSVertexer.cxx:164
 AliITSVertexer.cxx:165
 AliITSVertexer.cxx:166
 AliITSVertexer.cxx:167
 AliITSVertexer.cxx:168
 AliITSVertexer.cxx:169
 AliITSVertexer.cxx:170
 AliITSVertexer.cxx:171
 AliITSVertexer.cxx:172
 AliITSVertexer.cxx:173
 AliITSVertexer.cxx:174
 AliITSVertexer.cxx:175
 AliITSVertexer.cxx:176
 AliITSVertexer.cxx:177
 AliITSVertexer.cxx:178
 AliITSVertexer.cxx:179
 AliITSVertexer.cxx:180
 AliITSVertexer.cxx:181
 AliITSVertexer.cxx:182
 AliITSVertexer.cxx:183
 AliITSVertexer.cxx:184
 AliITSVertexer.cxx:185
 AliITSVertexer.cxx:186
 AliITSVertexer.cxx:187
 AliITSVertexer.cxx:188
 AliITSVertexer.cxx:189
 AliITSVertexer.cxx:190
 AliITSVertexer.cxx:191
 AliITSVertexer.cxx:192
 AliITSVertexer.cxx:193
 AliITSVertexer.cxx:194
 AliITSVertexer.cxx:195
 AliITSVertexer.cxx:196
 AliITSVertexer.cxx:197
 AliITSVertexer.cxx:198
 AliITSVertexer.cxx:199
 AliITSVertexer.cxx:200
 AliITSVertexer.cxx:201
 AliITSVertexer.cxx:202
 AliITSVertexer.cxx:203
 AliITSVertexer.cxx:204
 AliITSVertexer.cxx:205
 AliITSVertexer.cxx:206
 AliITSVertexer.cxx:207
 AliITSVertexer.cxx:208
 AliITSVertexer.cxx:209
 AliITSVertexer.cxx:210
 AliITSVertexer.cxx:211
 AliITSVertexer.cxx:212
 AliITSVertexer.cxx:213
 AliITSVertexer.cxx:214
 AliITSVertexer.cxx:215
 AliITSVertexer.cxx:216
 AliITSVertexer.cxx:217
 AliITSVertexer.cxx:218
 AliITSVertexer.cxx:219
 AliITSVertexer.cxx:220
 AliITSVertexer.cxx:221
 AliITSVertexer.cxx:222
 AliITSVertexer.cxx:223
 AliITSVertexer.cxx:224
 AliITSVertexer.cxx:225
 AliITSVertexer.cxx:226
 AliITSVertexer.cxx:227
 AliITSVertexer.cxx:228
 AliITSVertexer.cxx:229
 AliITSVertexer.cxx:230
 AliITSVertexer.cxx:231
 AliITSVertexer.cxx:232
 AliITSVertexer.cxx:233
 AliITSVertexer.cxx:234
 AliITSVertexer.cxx:235
 AliITSVertexer.cxx:236
 AliITSVertexer.cxx:237
 AliITSVertexer.cxx:238
 AliITSVertexer.cxx:239
 AliITSVertexer.cxx:240
 AliITSVertexer.cxx:241
 AliITSVertexer.cxx:242
 AliITSVertexer.cxx:243
 AliITSVertexer.cxx:244
 AliITSVertexer.cxx:245
 AliITSVertexer.cxx:246
 AliITSVertexer.cxx:247
 AliITSVertexer.cxx:248
 AliITSVertexer.cxx:249
 AliITSVertexer.cxx:250
 AliITSVertexer.cxx:251