// Implementation of the ITS clusterer V2 class
//
// Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
+// This class is no longer used for ITS recosntruction:
+// it has been replaced by the AliITSClusterFinderV2SXD classes
+// It is still used as mother class by HLT reconstruction
//-------------------------------------------------------------------------
-//uncomment the line below for running with V1 cluster finder classes
-//#define V1
+
+#include "AliLoader.h"
#include "AliRun.h"
#include "AliITSclustererV2.h"
fTanP(0),
fTanN(0){
//default constructor
- }
+ for(Int_t i=0;i<260;i++)fYSPD[i]=0.;
+ for(Int_t i=0;i<170;i++)fZSPD[i]=0.;
+ for(Int_t i=0;i<2200;i++){
+ fYshift[i]=0.;
+ fZshift[i]=0.;
+ fNdet[i]=0;
+ fNlayer[i]=0;
+ }
+
+}
AliITSclustererV2::AliITSclustererV2(const Char_t *geom):
fNModules(AliITSgeomTGeo::GetNModules()),
fEvent(0),
//------------------------------------------------------------
// This function creates ITS clusters from raw data
//------------------------------------------------------------
- AliRunLoader* runLoader = AliRunLoader::GetRunLoader();
+ AliRunLoader* runLoader = AliRunLoader::Instance();
if (!runLoader) {
Error("Digits2Clusters", "no run loader found");
return;
// write all clusters to the tree
Int_t nClusters = 0;
+ TClonesArray *emptyArray=new TClonesArray("AliITSclusterV2");
for (Int_t iModule = 0; iModule < fNModules; iModule++) {
array = clusters[iModule];
if (!array) {
Error("Digits2Clusters", "data for module %d missing!", iModule);
- array = new TClonesArray("AliITSclusterV2");
+ array = emptyArray;
}
cTree->SetBranchAddress("Clusters", &array);
cTree->Fill();
nClusters += array->GetEntriesFast();
- delete array;
}
+ delete emptyArray;
+
itsLoader->WriteRecPoints("OVERWRITE");
delete[] clusters;
//------------------------------------------------------------
// Tries to find mother's labels
//------------------------------------------------------------
+ AliRunLoader *rl = AliRunLoader::Instance();
+ TTree *trK=(TTree*)rl->TreeK();
+
+ if(trK){
Int_t label=lab[0];
if (label>=0) {
- TParticle *part=(TParticle*)gAlice->GetMCApp()->Particle(label);
- label=-3;
- while (part->P() < 0.005) {
- Int_t m=part->GetFirstMother();
- if (m<0) {
- Info("CheckLabels","Primary momentum: %f",part->P());
- break;
- }
- if (part->GetStatusCode()>0) {
- Info("CheckLabels","Primary momentum: %f",part->P());
- break;
- }
- label=m;
- part=(TParticle*)gAlice->GetMCApp()->Particle(label);
- }
- if (lab[1]<0) lab[1]=label;
- else if (lab[2]<0) lab[2]=label;
- else ;//cerr<<"CheckLabels : No empty labels !\n";
+ TParticle *part=(TParticle*)gAlice->GetMCApp()->Particle(label);
+ label=-3;
+ while (part->P() < 0.005) {
+ Int_t m=part->GetFirstMother();
+ if (m<0) {
+ Info("CheckLabels","Primary momentum: %f",part->P());
+ break;
+ }
+ if (part->GetStatusCode()>0) {
+ Info("CheckLabels","Primary momentum: %f",part->P());
+ break;
+ }
+ label=m;
+ part=(TParticle*)gAlice->GetMCApp()->Particle(label);
+ }
+ if(lab[1]<0){
+ lab[1]=label;
+ }
+ else if (lab[2]<0) {
+ lab[2]=label;
+ }
+ else {
+ // cerr<<"CheckLabels : No empty labels !\n";
+ }
}
+ }
}
/*
//------------------------------------------------------------
// Tries to find mother's labels
//------------------------------------------------------------
- Int_t nlabels =0;
- for (Int_t i=0;i<10;i++) if (lab[i]>=0) nlabels++;
- if(nlabels == 0) return; // In case of no labels just exit
+ AliRunLoader *rl = AliRunLoader::Instance();
+ TTree *trK=(TTree*)rl->TreeK();
- Int_t ntracks = gAlice->GetMCApp()->GetNtrack();
+ if(trK){
+ Int_t nlabels =0;
+ for (Int_t i=0;i<10;i++) if (lab[i]>=0) nlabels++;
+ if(nlabels == 0) return; // In case of no labels just exit
- for (Int_t i=0;i<10;i++){
- Int_t label = lab[i];
- if (label>=0 && label<ntracks) {
- TParticle *part=(TParticle*)gAlice->GetMCApp()->Particle(label);
- if (part->P() < 0.02) {
+ Int_t ntracks = gAlice->GetMCApp()->GetNtrack();
+
+ for (Int_t i=0;i<10;i++){
+ Int_t label = lab[i];
+ if (label>=0 && label<ntracks) {
+ TParticle *part=(TParticle*)gAlice->GetMCApp()->Particle(label);
+ if (part->P() < 0.02) {
Int_t m=part->GetFirstMother();
if (m<0) {
continue;
continue;
}
lab[i]=m;
+ }
+ else
+ if (part->P() < 0.12 && nlabels>3) {
+ lab[i]=-2;
+ nlabels--;
+ }
}
- else
- if (part->P() < 0.12 && nlabels>3) {
+ else{
+ if ( (label>ntracks||label <0) && nlabels>3) {
lab[i]=-2;
nlabels--;
}
- }
- else{
- if ( (label>ntracks||label <0) && nlabels>3) {
- lab[i]=-2;
- nlabels--;
- }
- }
- }
- if (nlabels>3){
- for (Int_t i=0;i<10;i++){
- if (nlabels>3){
- Int_t label = lab[i];
- if (label>=0 && label<ntracks) {
- TParticle *part=(TParticle*)gAlice->GetMCApp()->Particle(label);
- if (part->P() < 0.1) {
- lab[i]=-2;
- nlabels--;
+ }
+ }
+ if (nlabels>3){
+ for (Int_t i=0;i<10;i++){
+ if (nlabels>3){
+ Int_t label = lab[i];
+ if (label>=0 && label<ntracks) {
+ TParticle *part=(TParticle*)gAlice->GetMCApp()->Particle(label);
+ if (part->P() < 0.1) {
+ lab[i]=-2;
+ nlabels--;
+ }
}
}
}
}
- }
- //compress labels -- if multi-times the same
- Int_t lab2[10];
- for (Int_t i=0;i<10;i++) lab2[i]=-2;
- for (Int_t i=0;i<10 ;i++){
- if (lab[i]<0) continue;
- for (Int_t j=0;j<10 &&lab2[j]!=lab[i];j++){
- if (lab2[j]<0) {
- lab2[j]= lab[i];
- break;
+ //compress labels -- if multi-times the same
+ Int_t lab2[10];
+ for (Int_t i=0;i<10;i++) lab2[i]=-2;
+ for (Int_t i=0;i<10 ;i++){
+ if (lab[i]<0) continue;
+ for (Int_t j=0;j<10 &&lab2[j]!=lab[i];j++){
+ if (lab2[j]<0) {
+ lab2[j]= lab[i];
+ break;
+ }
}
}
+ for (Int_t j=0;j<10;j++) lab[j]=lab2[j];
}
- for (Int_t j=0;j<10;j++) lab[j]=lab2[j];
-
}
static void AddLabel(Int_t lab[10], Int_t label) {
+// add label of the particle in the kine tree which originates this cluster
+// (used for reconstruction of MC data only, for comparison purposes)
+ AliRunLoader *rl = AliRunLoader::Instance();
+ TTree *trK=(TTree*)rl->TreeK();
- if(label<0) return; // In case of no label just exit
+ if(trK){
+ if(label<0) return; // In case of no label just exit
- Int_t ntracks = gAlice->GetMCApp()->GetNtrack();
- if (label>ntracks) return;
- for (Int_t i=0;i<10;i++){
- // if (label<0) break;
- if (lab[i]==label) break;
- if (lab[i]<0) {
- lab[i]= label;
- break;
+ Int_t ntracks = gAlice->GetMCApp()->GetNtrack();
+ if (label>ntracks) return;
+ for (Int_t i=0;i<10;i++){
+ // if (label<0) break;
+ if (lab[i]==label) break;
+ if (lab[i]<0) {
+ lab[i]= label;
+ break;
+ }
}
}
}
//***********************************
-#ifndef V1
void AliITSclustererV2::
FindCluster(Int_t k,Int_t maxz,AliBin *bins,Int_t &n,Int_t *idx) {
for (Int_t iz=zmin; iz<=zmax;iz+=idz)
for (Int_t iy=ymin; iy<=ymax;iy+=idy){
//
- Int_t ndigits =0;
+ Int_t nodigits =0;
Float_t y=0.,z=0.,q=0.;
for (Int_t l=0; l<ni; l++) {
d=(AliITSdigitSPD*)digits->UncheckedAt(idx[l]);
if (TMath::Abs( d->GetCoord2()-iy)>0.75*idy) continue;
if (TMath::Abs( d->GetCoord1()-iz)>0.75*idz) continue;
}
- ndigits++;
+ nodigits++;
Float_t qq=d->GetSignal();
y+=qq*fYSPD[d->GetCoord2()]; z+=qq*fZSPD[d->GetCoord1()]; q+=qq;
}
- if (ndigits==0) continue;
+ if (nodigits==0) continue;
y/=q; z/=q;
y-=fHwSPD; z-=fHlSPD;
lp[4]= (zmax-zmin+1)*100 + (ymax-ymin+1);
milab[3]=fNdet[fI];
- d=(AliITSdigitSPD*)digits->UncheckedAt(idx[0]);
Int_t info[3] = {ymax-ymin+1,zmax-zmin+1,fNlayer[fI]};
new (cl[n]) AliITSclusterV2(milab,lp,info); n++;
}
}
// fill the current digit into the bins array
- Int_t index = (input->GetCoord2()+1) * kNzBins + (input->GetCoord1()+1);
- bins[index].SetIndex(index);
- bins[index].SetMask(1);
- bins[index].SetQ(1);
+ if(bins){
+ Int_t index = (input->GetCoord2()+1) * kNzBins + (input->GetCoord1()+1);
+ bins[index].SetIndex(index);
+ bins[index].SetMask(1);
+ bins[index].SetQ(1);
+ }
}
delete [] binsSPDInit;
}
*/
- c.SetSigmaY2(0.0030*0.0030);
- c.SetSigmaZ2(0.0020*0.0020);
- c.SetDetectorIndex(fNdet[fI]);
-
Float_t y=c.GetY(),z=c.GetZ(), q=c.GetQ();
y/=q; z/=q;
//
y=-(-y+fYshift[fI]);
z= -z+fZshift[fI];
- c.SetY(y);
- c.SetZ(z);
- c.SetNy(maxj-minj+1);
- c.SetNz(maxi-mini+1);
- c.SetType(npeaks);
- c.SetQ(q/12.7); //to be consistent with the SSD charges
+
+ q/=12.7; //this WAS consistent with SSD. To be reassessed
+ // 23-MAR-2007
+ Float_t hit[5] = {y, z, 0.0030*0.0030, 0.0020*0.0020, q};
+ Int_t info[3] = {maxj-minj+1, maxi-mini+1, fNlayer[fI]};
if (c.GetQ() < 20.) continue; //noise cluster
//lab[2]=(d->GetTracks())[2];
//CheckLabels(lab);
CheckLabels2(milab);
- c.SetLabel(milab[0],0);
- c.SetLabel(milab[1],1);
- c.SetLabel(milab[2],2);
- c.SetLayer(fNlayer[fI]);
}
}
- new (cl[ncl]) AliITSclusterV2(c); ncl++;
+ milab[3]=fNdet[fI];
+
+ AliITSclusterV2 *cc = new (cl[ncl]) AliITSclusterV2(milab,hit,info);
+ cc->SetType(npeaks);
+ ncl++;
}
}
}
Int_t smax = digits->GetEntriesFast();
if (smax==0) return;
- const Int_t MAX=1000;
+ const Int_t mMAX=1000;
Int_t np=0, nn=0;
- Ali1Dcluster pos[MAX], neg[MAX];
+ Ali1Dcluster pos[mMAX], neg[mMAX];
Float_t y=0., q=0., qmax=0.;
Int_t lab[4]={-2,-2,-2,-2};
c[*n].SetY(y/q-0.3*nd);
c[*n].SetQ(0.5*q);
(*n)++;
- if (*n==MAX) {
+ if (*n==mMAX) {
Error("FindClustersSSD","Too many 1D clusters !");
return;
}
c[*n].SetQ(0.5*q);
c[*n].SetNd(nd);
(*n)++;
- if (*n==MAX) {
+ if (*n==mMAX) {
Error("FindClustersSSD","Too many 1D clusters !");
return;
}
c[*n].SetY(y/q-0.25*nd);
c[*n].SetQ(0.5*q);
(*n)++;
- if (*n==MAX) {
+ if (*n==mMAX) {
Error("FindClustersSSD","Too many 1D clusters !");
return;
}
c[*n].SetLabels(milab);
}
(*n)++;
- if (*n==MAX) {
+ if (*n==mMAX) {
Error("FindClustersSSD","Too many 1D clusters !");
return;
}
c[*n].SetY(y/q-0.25*nd);
c[*n].SetQ(0.5*q);
(*n)++;
- if (*n==MAX) {
+ if (*n==mMAX) {
Error("FindClustersSSD","Too many 1D clusters !");
return;
}
c[*n].SetLabels(lab);
}
(*n)++;
- if (*n==MAX) {
+ if (*n==mMAX) {
Error("FindClustersSSD","Too many 1D clusters !");
return;
}
// Actual SSD cluster finder for raw data
//------------------------------------------------------------
Int_t nClustersSSD = 0;
- const Int_t MAX = 1000;
- Ali1Dcluster clusters1D[2][MAX];
+ const Int_t mMAX = 1000;
+ Ali1Dcluster clusters1D[2][mMAX];
Int_t nClusters[2] = {0, 0};
Int_t lab[3]={-2,-2,-2};
Float_t q = 0.;
if ((!next || (input->GetModuleID() != prevModule)||
(strip-prevStrip > 1) || (flag != prevFlag)) &&
(nDigits > 0)) {
- if (nClusters[prevFlag] == MAX) {
+ if (nClusters[prevFlag] == mMAX) {
Error("FindClustersSSD", "Too many 1D clusters !");
return;
}
if (nDigits > 4&&nDigits < 25) {
cluster.SetY(y/q - 0.25*nDigits);
cluster.SetQ(0.5*q);
- if (nClusters[prevFlag] == MAX) {
+ if (nClusters[prevFlag] == mMAX) {
Error("FindClustersSSD", "Too many 1D clusters !");
return;
}
fI = iModule;
FindClustersSSD(&clusters1D[0][0], nClusters[0],
&clusters1D[1][0], nClusters[1], clusters[iModule]);
- Int_t nClusters = clusters[iModule]->GetEntriesFast();
- nClustersSSD += nClusters;
+ Int_t noClusters = clusters[iModule]->GetEntriesFast();
+ nClustersSSD += noClusters;
}
if (!next) break;
Info("FindClustersSSD", "found clusters in ITS SSD: %d", nClustersSSD);
}
-#else //V1
-
-#include "AliITSDetType.h"
-#include "AliITS.h"
-#include "AliITSsegmentationSPD.h"
-#include "AliITSClusterFinderSPD.h"
-
-#include "AliITSresponseSDD.h"
-#include "AliITSsegmentationSDD.h"
-#include "AliITSClusterFinderSDD.h"
-
-#include "AliITSsegmentationSSD.h"
-#include "AliITSClusterFinderSSD.h"
-
-
-void AliITSclustererV2::
-FindClustersSPD(const TClonesArray *digits, TClonesArray *clusters) {
- //------------------------------------------------------------
- // Actual SPD cluster finding based on AliITSClusterFinderSPD
- //------------------------------------------------------------
- static AliITS *its=(AliITS*)gAlice->GetModule("ITS");
- static TClonesArray *points=its->RecPoints();
- static AliITSsegmentationSPD *seg=
- (AliITSsegmentationSPD *)its->DetType(0)->GetSegmentationModel();
- static AliITSClusterFinderSPD cf(seg, (TClonesArray*)digits, points);
-
- cf.FindRawClusters(fI);
- RecPoints2Clusters(points, fI, clusters);
- its->ResetRecPoints();
-
-}
-
-void AliITSclustererV2::
-FindClustersSDD(const TClonesArray *digits, TClonesArray *clusters) {
- //------------------------------------------------------------
- // Actual SDD cluster finding based on AliITSClusterFinderSDD
- //------------------------------------------------------------
- static AliITS *its=(AliITS*)gAlice->GetModule("ITS");
- static TClonesArray *points=its->RecPoints();
- static AliITSresponseSDD *resp=
- (AliITSresponseSDD *)its->DetType(1)->GetResponseModel();
- static AliITSsegmentationSDD *seg=
- (AliITSsegmentationSDD *)its->DetType(1)->GetSegmentationModel();
- static AliITSClusterFinderSDD
- cf(seg,resp,(TClonesArray*)digits,its->ClustersAddress(1));
-
- cf.FindRawClusters(fI);
- Int_t nc=points->GetEntriesFast();
- while (nc--) { //To be consistent with the SSD cluster charges
- AliITSRecPoint *p=(AliITSRecPoint*)points->UncheckedAt(nc);
- p->SetQ(p->GetQ()/12.);
- }
- RecPoints2Clusters(points, fI, clusters);
- its->ResetClusters(1);
- its->ResetRecPoints();
-
-}
-
-void AliITSclustererV2::
-FindClustersSSD(const TClonesArray *digits, TClonesArray *clusters) {
- //------------------------------------------------------------
- // Actual SSD cluster finding based on AliITSClusterFinderSSD
- //------------------------------------------------------------
- static AliITS *its=(AliITS*)gAlice->GetModule("ITS");
- static TClonesArray *points=its->RecPoints();
- static AliITSsegmentationSSD *seg=
- (AliITSsegmentationSSD *)its->DetType(2)->GetSegmentationModel();
- static AliITSClusterFinderSSD cf(seg,(TClonesArray*)digits);
-
- cf.FindRawClusters(fI);
- RecPoints2Clusters(points, fI, clusters);
- its->ResetRecPoints();
-
-}
-
-#endif