+//________________________________________________________
+void AliITSVertexer3D::MarkUsedClusters(){
+ // Mark clusters of tracklets used in vertex claulation
+ for(Int_t i=0; i<fLines.GetEntriesFast();i++){
+ AliStrLine *lin = (AliStrLine*)fLines.At(i);
+ Int_t idClu1=lin->GetIdPoint(0);
+ Int_t idClu2=lin->GetIdPoint(1);
+ fUsedCluster.SetBitNumber(idClu1);
+ fUsedCluster.SetBitNumber(idClu2);
+ }
+}
+//________________________________________________________
+Int_t AliITSVertexer3D::RemoveTracklets(){
+ // Remove trackelts close to first found vertex
+ Double_t vert[3]={fVert3D.GetXv(),fVert3D.GetYv(),fVert3D.GetZv()};
+ Int_t nRemoved=0;
+ for(Int_t i=0; i<fLines.GetEntriesFast();i++){
+ AliStrLine *lin = (AliStrLine*)fLines.At(i);
+ if(lin->GetDistFromPoint(vert)<fDCAforPileup){
+ Int_t idClu1=lin->GetIdPoint(0);
+ Int_t idClu2=lin->GetIdPoint(1);
+ fUsedCluster.SetBitNumber(idClu1);
+ fUsedCluster.SetBitNumber(idClu2);
+ fLines.RemoveAt(i);
+ ++nRemoved;
+ }
+ }
+ fLines.Compress();
+ return nRemoved;
+}
+//________________________________________________________
+void AliITSVertexer3D::FindOther3DVertices(TTree *itsClusterTree){
+ // pileup identification based on 3D vertexing with not used clusters
+ MarkUsedClusters();
+ fLines.Clear("C");
+ Int_t nolines = FindTracklets(itsClusterTree,2);
+ if(nolines>=2){
+ Int_t nr=RemoveTracklets();
+ nolines-=nr;
+ if(nolines>=2){
+ Int_t rc=Prepare3DVertex(2);
+ if(rc==0){
+ fVert3D=AliVertexerTracks::TrackletVertexFinder(&fLines,0);
+ if(fVert3D.GetNContributors()>=fMinTrackletsForPilup){
+ fIsPileup=kTRUE;
+ fZpuv=fVert3D.GetZv();
+ fNTrpuv=fVert3D.GetNContributors();
+ }
+ }
+ }
+ }
+}
+//______________________________________________________________________
+void AliITSVertexer3D::PileupFromZ(){
+ // Calls the pileup algorithm of ALiITSVertexerZ
+ Int_t binmin, binmax;
+ Int_t nPeaks=AliITSVertexerZ::GetPeakRegion(fZHisto,binmin,binmax);
+ if(nPeaks==2)AliWarning("2 peaks found");
+ Int_t firstPeakCont=0;
+ Float_t firstPeakPos=0.;
+ for(Int_t i=binmin-1;i<=binmax+1;i++){
+ firstPeakCont+=fZHisto->GetBinContent(i);
+ firstPeakPos+=fZHisto->GetBinContent(i)*fZHisto->GetBinCenter(i);
+ }
+ firstPeakPos/=firstPeakCont;
+ Int_t ncontr2=0;
+ if(firstPeakCont>fMinTrackletsForPilup){
+ Float_t secPeakPos;
+ ncontr2=AliITSVertexerZ::FindSecondPeak(fZHisto,binmin,binmax,secPeakPos);
+ if(ncontr2>=fMinTrackletsForPilup){
+ fIsPileup=kTRUE;
+ fZpuv=secPeakPos;
+ fNTrpuv=ncontr2;
+ }
+ }
+}