#include<TH1.h>
#include <TString.h>
#include<TTree.h>
-#include "AliITSLoader.h"
-#include "AliITSgeom.h"
+#include "AliESDVertex.h"
+#include "AliITSgeomTGeo.h"
#include "AliITSDetTypeRec.h"
#include "AliITSRecPoint.h"
#include "AliITSZPoint.h"
}
//______________________________________________________________________
-AliITSVertexerZ::AliITSVertexerZ(TString fn, Float_t x0, Float_t y0):AliITSVertexer(fn),
+AliITSVertexerZ::AliITSVertexerZ(Float_t x0, Float_t y0):AliITSVertexer(),
fFirstL1(0),
fLastL1(0),
fFirstL2(0),
}
-//______________________________________________________________________
-AliITSVertexerZ::AliITSVertexerZ(const AliITSVertexerZ &vtxr) : AliITSVertexer(vtxr),
-fFirstL1(vtxr.fFirstL1),
-fLastL1(vtxr.fLastL1),
-fFirstL2(vtxr.fFirstL2),
-fLastL2(vtxr.fLastL2),
-fDiffPhiMax(vtxr.fDiffPhiMax),
-fZFound(vtxr.fZFound),
-fZsig(vtxr.fZsig),
-fZCombc(vtxr.fZCombc),
-fLowLim(vtxr.fLowLim),
-fHighLim(vtxr.fHighLim),
-fStepCoarse(vtxr.fStepCoarse),
-fTolerance(vtxr.fTolerance),
-fMaxIter(vtxr.fMaxIter),
-fWindowWidth(vtxr.fWindowWidth){
- // Copy constructor
-
-}
-
-//______________________________________________________________________
-AliITSVertexerZ& AliITSVertexerZ::operator=(const AliITSVertexerZ& vtxr ){
- // Assignment operator
-
- this->~AliITSVertexerZ();
- new(this) AliITSVertexerZ(vtxr);
- return *this;
-}
-
//______________________________________________________________________
AliITSVertexerZ::~AliITSVertexerZ() {
// Destructor
}
//______________________________________________________________________
-Int_t AliITSVertexerZ::GetPeakRegion(TH1F*h, Int_t &binmin, Int_t &binmax) const {
+Int_t AliITSVertexerZ::GetPeakRegion(TH1F*h, Int_t &binmin, Int_t &binmax){
// Finds a region around a peak in the Z histogram
// Case of 2 peaks is treated
Int_t imax=h->GetNbinsX();
return npeaks;
}
//______________________________________________________________________
-AliESDVertex* AliITSVertexerZ::FindVertexForCurrentEvent(Int_t evnumber){
+AliESDVertex* AliITSVertexerZ::FindVertexForCurrentEvent(TTree *itsClusterTree){
// Defines the AliESDVertex for the current event
- VertexZFinder(evnumber);
+ VertexZFinder(itsClusterTree);
Int_t ntrackl=0;
for(Int_t iteraz=0;iteraz<fMaxIter;iteraz++){
if(fCurrentVertex) ntrackl=fCurrentVertex->GetNContributors();
if(!fCurrentVertex || ntrackl==0 || ntrackl==-1){
Float_t diffPhiMaxOrig=fDiffPhiMax;
fDiffPhiMax=GetPhiMaxIter(iteraz);
- VertexZFinder(evnumber);
+ VertexZFinder(itsClusterTree);
fDiffPhiMax=diffPhiMaxOrig;
}
}
- FindMultiplicity(evnumber);
+ FindMultiplicity(itsClusterTree);
return fCurrentVertex;
}
//______________________________________________________________________
-void AliITSVertexerZ::VertexZFinder(Int_t evnumber){
+void AliITSVertexerZ::VertexZFinder(TTree *itsClusterTree){
// Defines the AliESDVertex for the current event
fCurrentVertex = 0;
- AliRunLoader *rl =AliRunLoader::GetRunLoader();
- AliITSLoader* itsLoader = (AliITSLoader*)rl->GetLoader("ITSLoader");
- AliITSgeom* geom = itsLoader->GetITSgeom();
- itsLoader->LoadRecPoints();
- rl->GetEvent(evnumber);
+ ResetVertex();
- AliITSDetTypeRec detTypeRec;
+ if(!GetDetTypeRec())AliFatal("DetTypeRec pointer has not been set");
- TTree *tR = itsLoader->TreeR();
- detTypeRec.SetTreeAddressR(tR);
+ TTree *tR = itsClusterTree;
+ fDetTypeRec->SetTreeAddressR(tR);
TClonesArray *itsRec = 0;
// lc1 and gc1 are local and global coordinates for layer 1
Float_t lc1[3]; for(Int_t ii=0; ii<3; ii++) lc1[ii]=0.;
Float_t lc2[3]; for(Int_t ii=0; ii<3; ii++) lc2[ii]=0.;
Float_t gc2[3]; for(Int_t ii=0; ii<3; ii++) gc2[ii]=0.;
- itsRec = detTypeRec.RecPoints();
+ itsRec = fDetTypeRec->RecPoints();
TBranch *branch;
branch = tR->GetBranch("ITSRecPoints");
+ if(!branch){
+ AliWarning("Null pointer for RecPoints branch, vertex not calculated");
+ ResetHistograms();
+ fCurrentVertex = new AliESDVertex(0.,5.3,-2);
+ return;
+ }
Int_t nrpL1 = 0;
Int_t nrpL2 = 0;
for(Int_t module= fFirstL1; module<=fLastL1;module++){
branch->GetEvent(module);
nrpL1+= itsRec->GetEntries();
- detTypeRec.ResetRecPoints();
+ fDetTypeRec->ResetRecPoints();
}
//By default fFirstL2=80 and fLastL2=239
for(Int_t module= fFirstL2; module<=fLastL2;module++){
branch->GetEvent(module);
nrpL2+= itsRec->GetEntries();
- detTypeRec.ResetRecPoints();
+ fDetTypeRec->ResetRecPoints();
}
if(nrpL1 == 0 || nrpL2 == 0){
+ AliDebug(1,Form("No RecPoints in at least one SPD layer (%d %d)",nrpL1,nrpL2));
ResetHistograms();
- itsLoader->UnloadRecPoints();
fCurrentVertex = new AliESDVertex(0.,5.3,-2);
return;
}
Float_t theta2L1=14.1*14.1/(beta2*p2*1e6)*TMath::Abs(dL1);
*/
Int_t maxdim=TMath::Min(nrpL1*nrpL2,50000); // temporary; to limit the size in PbPb
- TClonesArray *points = new TClonesArray("AliITSZPoint",maxdim);
- TClonesArray &pts = *points;
+ static TClonesArray points("AliITSZPoint",maxdim);
Int_t nopoints =0;
for(Int_t modul1= fFirstL1; modul1<=fLastL1;modul1++){ // Loop on modules of layer 1
+ if(!fUseModule[modul1]) continue;
UShort_t ladder=int(modul1/4)+1; // ladders are numbered starting from 1
branch->GetEvent(modul1);
Int_t nrecp1 = itsRec->GetEntries();
- TClonesArray *prpl1 = new TClonesArray("AliITSRecPoint",nrecp1);
- prpl1->SetOwner();
- TClonesArray &rpl1 = *prpl1;
+ static TClonesArray prpl1("AliITSRecPoint",nrecp1);
+ prpl1.SetOwner();
for(Int_t j=0;j<nrecp1;j++){
AliITSRecPoint *recp = (AliITSRecPoint*)itsRec->At(j);
- new(rpl1[j])AliITSRecPoint(*recp);
+ new(prpl1[j])AliITSRecPoint(*recp);
}
- detTypeRec.ResetRecPoints();
+ fDetTypeRec->ResetRecPoints();
for(Int_t j1=0;j1<nrecp1;j1++){
- AliITSRecPoint *recp = (AliITSRecPoint*)prpl1->At(j1);
+ AliITSRecPoint *recp = (AliITSRecPoint*)prpl1.At(j1);
+ /*
lc1[0]=recp->GetDetLocalX();
lc1[2]=recp->GetDetLocalZ();
geom->LtoG(modul1,lc1,gc1);
// Global coordinates of this recpoints
- gc1[0]-=fNominalPos[0]; // Possible beam offset in the bending plane
- gc1[1]-=fNominalPos[1]; // " "
+ */
+ recp->GetGlobalXYZ(gc1);
+ gc1[0]-=GetNominalPos()[0]; // Possible beam offset in the bending plane
+ gc1[1]-=GetNominalPos()[1]; // " "
Float_t r1=TMath::Sqrt(gc1[0]*gc1[0]+gc1[1]*gc1[1]);
Float_t phi1 = TMath::ATan2(gc1[1],gc1[0]);
if(phi1<0)phi1+=2*TMath::Pi();
for(Int_t ladl2=0 ; ladl2<fLadOnLay2*2+1;ladl2++){
for(Int_t k=0;k<4;k++){
Int_t ladmod=fLadders[ladder-1]+ladl2;
- if(ladmod>geom->GetNladders(2)) ladmod=ladmod-geom->GetNladders(2);
- Int_t modul2=geom->GetModuleIndex(2,ladmod,k+1);
+ if(ladmod>AliITSgeomTGeo::GetNLadders(2)) ladmod=ladmod-AliITSgeomTGeo::GetNLadders(2);
+ Int_t modul2=AliITSgeomTGeo::GetModuleIndex(2,ladmod,k+1);
+ if(!fUseModule[modul2]) continue;
branch->GetEvent(modul2);
Int_t nrecp2 = itsRec->GetEntries();
for(Int_t j2=0;j2<nrecp2;j2++){
recp = (AliITSRecPoint*)itsRec->At(j2);
+ /*
lc2[0]=recp->GetDetLocalX();
lc2[2]=recp->GetDetLocalZ();
geom->LtoG(modul2,lc2,gc2);
- gc2[0]-=fNominalPos[0];
- gc2[1]-=fNominalPos[1];
+ */
+ recp->GetGlobalXYZ(gc2);
+ gc2[0]-=GetNominalPos()[0];
+ gc2[1]-=GetNominalPos()[1];
Float_t r2=TMath::Sqrt(gc2[0]*gc2[0]+gc2[1]*gc2[1]);
Float_t phi2 = TMath::ATan2(gc2[1],gc2[0]);
if(phi2<0)phi2+=2*TMath::Pi();
ezr0q+=r1*r1*(1+tgth*tgth)*theta2L1/2; // multiple scattering in layer 1
ezr0q+=rBP*rBP*(1+tgth*tgth)*theta2BP/2; // multiple scattering in beam pipe
*/
- if(nopoints<maxdim) new(pts[nopoints++])AliITSZPoint(zr0,ezr0q);
+ if(nopoints<maxdim) new(points[nopoints++])AliITSZPoint(zr0,ezr0q);
fZCombc->Fill(zr0);
}
}
- detTypeRec.ResetRecPoints();
+ fDetTypeRec->ResetRecPoints();
}
}
}
- delete prpl1;
+ prpl1.Clear();
}
- points->Sort();
+ points.Sort();
Double_t contents = fZCombc->GetEntries()- fZCombc->GetBinContent(0)-fZCombc->GetBinContent(nbincoarse+1);
if(contents<1.){
// Warning("FindVertexForCurrentEvent","Insufficient number of rec. points\n");
ResetHistograms();
- itsLoader->UnloadRecPoints();
fCurrentVertex = new AliESDVertex(0.,5.3,-1);
+ points.Clear();
return;
}
TH1F *hc = fZCombc;
- if(hc->GetBinContent(hc->GetMaximumBin())<3)hc->Rebin(3);
+ if(hc->GetBinContent(hc->GetMaximumBin())<3)hc->Rebin(4);
Int_t binmin,binmax;
Int_t nPeaks=GetPeakRegion(hc,binmin,binmax);
if(nPeaks==2)AliWarning("2 peaks found");
zm=0.;
ezm=0.;
ncontr=0;
- for(Int_t i =0; i<points->GetEntriesFast(); i++){
- AliITSZPoint* p=(AliITSZPoint*)points->UncheckedAt(i);
+ for(Int_t i =0; i<points.GetEntries(); i++){
+ AliITSZPoint* p=(AliITSZPoint*)points.UncheckedAt(i);
if(p->GetZ()>lim1 && p->GetZ()<lim2){
Float_t deno = p->GetErrZ();
zm+=p->GetZ()/deno;
ncontr++;
}
}
- zm/=ezm;
- ezm=TMath::Sqrt(1./ezm);
+ if(ezm>0) {
+ zm/=ezm;
+ ezm=TMath::Sqrt(1./ezm);
+ }
niter++;
} while(niter<10 && TMath::Abs((zm-lim1)-(lim2-zm))>fTolerance);
fCurrentVertex = new AliESDVertex(zm,ezm,ncontr);
- fCurrentVertex->SetTitle("vertexer: B");
- delete points;
+ fCurrentVertex->SetTitle("vertexer: Z");
+ fNoVertices=1;
+ points.Clear();
+ if(ncontr>fMinTrackletsForPilup){
+ Float_t secPeakPos;
+ Int_t ncontr2=FindSecondPeak(fZCombc,binmin,binmax,secPeakPos);
+ if(ncontr2>=fMinTrackletsForPilup){
+ fIsPileup=kTRUE;
+ fNoVertices=2;
+ fZpuv=secPeakPos;
+ fNTrpuv=ncontr2;
+ AliESDVertex secondVert(secPeakPos,0.1,ncontr2);
+ fVertArray = new AliESDVertex[2];
+ fVertArray[0]=(*fCurrentVertex);
+ fVertArray[1]=secondVert;
+ }
+ }
+ if(fNoVertices==1){
+ fVertArray = new AliESDVertex[1];
+ fVertArray[0]=(*fCurrentVertex);
+ }
+
ResetHistograms();
- itsLoader->UnloadRecPoints();
return;
}
-
+//_____________________________________________________________________
+Int_t AliITSVertexerZ::FindSecondPeak(TH1F* h, Int_t binmin,Int_t binmax, Float_t& secPeakPos){
+ for(Int_t i=binmin-1;i<=binmax+1;i++){
+ h->SetBinContent(i,0.);
+ }
+ Int_t secPeakBin=h->GetMaximumBin();
+ secPeakPos=h->GetBinCenter(secPeakBin);
+ Int_t secPeakCont=(Int_t)h->GetBinContent(secPeakBin);
+ secPeakCont+=(Int_t)h->GetBinContent(secPeakBin-1);
+ secPeakCont+=(Int_t)h->GetBinContent(secPeakBin+1);
+ secPeakCont+=(Int_t)h->GetBinContent(secPeakBin-2);
+ secPeakCont+=(Int_t)h->GetBinContent(secPeakBin+2);
+ return secPeakCont;
+}
//_____________________________________________________________________
void AliITSVertexerZ::ResetHistograms(){
fZCombc = 0;
}
-//______________________________________________________________________
-void AliITSVertexerZ::FindVertices(){
- // computes the vertices of the events in the range FirstEvent - LastEvent
- AliRunLoader *rl = AliRunLoader::GetRunLoader();
- AliITSLoader* itsLoader = (AliITSLoader*) rl->GetLoader("ITSLoader");
- itsLoader->ReloadRecPoints();
- for(Int_t i=fFirstEvent;i<=fLastEvent;i++){
- // cout<<"Processing event "<<i<<endl;
- rl->GetEvent(i);
- FindVertexForCurrentEvent(i);
- if(fCurrentVertex){
- WriteCurrentVertex();
- }
- }
-}
-
//________________________________________________________
void AliITSVertexerZ::PrintStatus() const {
// Print current status
cout <<"Limits for Z histograms: "<<fLowLim<<"; "<<fHighLim<<endl;
cout <<"Bin sizes for coarse z histos "<<fStepCoarse<<endl;
cout <<" Current Z "<<fZFound<<"; Z sig "<<fZsig<<endl;
- cout <<"First event to be processed "<<fFirstEvent;
- cout <<"\n Last event to be processed "<<fLastEvent<<endl;
if(fZCombc){
cout<<"fZCombc exists - entries="<<fZCombc->GetEntries()<<endl;
}