X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSclustererV2.cxx;h=77c3531a210524032cff671ed71ba435846230a8;hb=6a62da73fb1ac261f88e15bf2ed2f5172012ad8b;hp=bba23509c4f836b429517fb0fd1c616f8ca92f6a;hpb=e43c066cbc76252a79f11f5bc1435a37cbc8bed3;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSclustererV2.cxx b/ITS/AliITSclustererV2.cxx index bba23509c4f..77c3531a210 100644 --- a/ITS/AliITSclustererV2.cxx +++ b/ITS/AliITSclustererV2.cxx @@ -2,14 +2,18 @@ // 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" #include "AliITSclusterV2.h" +#include "AliITSDetTypeRec.h" #include "AliRawReader.h" #include "AliITSRawStreamSPD.h" #include "AliITSRawStreamSDD.h" @@ -18,7 +22,7 @@ #include #include #include -#include "AliITSgeom.h" +#include "AliITSgeomTGeo.h" #include "AliITSdigitSPD.h" #include "AliITSdigitSDD.h" #include "AliITSdigitSSD.h" @@ -28,39 +32,84 @@ ClassImp(AliITSclustererV2) extern AliRun *gAlice; -AliITSclustererV2::AliITSclustererV2(const AliITSgeom *geom) { +AliITSclustererV2::AliITSclustererV2(): +fNModules(0), +fEvent(0), +fI(0), +fLastSPD1(0), +fNySPD(0), +fNzSPD(0), +fYpitchSPD(0), +fZ1pitchSPD(0), +fZ2pitchSPD(0), +fHwSPD(0), +fHlSPD(0), +fNySDD(0), +fNzSDD(0), +fYpitchSDD(0), +fZpitchSDD(0), +fHwSDD(0), +fHlSDD(0), +fYoffSDD(0), +fLastSSD1(0), +fYpitchSSD(0), +fHwSSD(0), +fHlSSD(0), +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), +fI(0), +fLastSPD1(AliITSgeomTGeo::GetModuleIndex(2,1,1)-1), +fNySPD(256), +fNzSPD(160), +fYpitchSPD(0.0050), +fZ1pitchSPD(0.0425), +fZ2pitchSPD(0.0625), +fHwSPD(0.64), +fHlSPD(3.48), +fNySDD(256), +fNzSDD(256), +fYpitchSDD(0.01825), +fZpitchSDD(0.02940), +fHwSDD(3.5085), +fHlSDD(3.7632), +fYoffSDD(0.0425), +fLastSSD1(AliITSgeomTGeo::GetModuleIndex(6,1,1)-1), +fYpitchSSD(0.0095), +fHwSSD(3.65), +fHlSSD(2.00), +fTanP(0.0275), +fTanN(0.0075) { //------------------------------------------------------------ // Standard constructor //------------------------------------------------------------ - AliITSgeom *g=(AliITSgeom*)geom; - - fEvent=0; - fI=0; - - Int_t mmax=geom->GetIndexMax(); - if (mmax>2200) { - Fatal("AliITSclustererV2","Too many ITS subdetectors !"); + if (geom) { + AliWarning("\"geom\" is actually a dummy argument !"); } Int_t m; - for (m=0; mGetModuleId(m,lay,lad,det); - Float_t x,y,z; g->GetTrans(lay,lad,det,x,y,z); - Double_t rot[9]; g->GetRotMatrix(lay,lad,det,rot); - Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi(); - Double_t ca=TMath::Cos(alpha), sa=TMath::Sin(alpha); - fYshift[m] = x*ca + y*sa; - fZshift[m] = (Double_t)z; - fNdet[m] = (lad-1)*g->GetNdetectors(lay) + (det-1); + for (m=0; mInverse()).GetTranslation()[1]; + fZshift[m] = (tm->Inverse()).GetTranslation()[2]; + fNdet[m] = (lad-1)*AliITSgeomTGeo::GetNDetectors(lay) + (det-1); fNlayer[m] = lay-1; } - fNModules = g->GetIndexMax(); //SPD geometry - fLastSPD1=g->GetModuleIndex(2,1,1)-1; - fNySPD=256; fNzSPD=160; - fYpitchSPD=0.0050; - fZ1pitchSPD=0.0425; fZ2pitchSPD=0.0625; - fHwSPD=0.64; fHlSPD=3.48; fYSPD[0]=0.5*fYpitchSPD; for (m=1; mGetModuleIndex(6,1,1)-1; - fYpitchSSD=0.0095; - fHwSSD=3.65; - fHlSSD=2.00; - fTanP=0.0275; - fTanN=0.0075; } @@ -118,6 +153,10 @@ Int_t AliITSclustererV2::Digits2Clusters(TTree *dTree, TTree *cTree) { else branch->SetAddress(&clusters); Int_t mmax=(Int_t)dTree->GetEntries(); + if (mmax!=fNModules) { + Error("Digits2Clusters","Number of entries != number of modules !"); + return 1; + } for (fI=0; fIGetEvent(fI); @@ -159,7 +198,7 @@ void AliITSclustererV2::Digits2Clusters(AliRawReader* rawReader) { //------------------------------------------------------------ // 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; @@ -197,17 +236,19 @@ void AliITSclustererV2::Digits2Clusters(AliRawReader* rawReader) { // 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; @@ -219,45 +260,59 @@ void AliITSclustererV2::Digits2Clusters(AliRawReader* rawReader) { //**** Fast clusters ******************************* #include "TParticle.h" -#include "AliITS.h" +//#include "AliITS.h" #include "AliITSmodule.h" #include "AliITSRecPoint.h" #include "AliITSsimulationFastPoints.h" #include "AliITSRecPoint.h" -/* + static void CheckLabels(Int_t lab[3]) { //------------------------------------------------------------ // 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"; + } } + } } -*/ + +/* static void CheckLabels(Int_t lab[3]) { //------------------------------------------------------------ // Tries to find mother's labels //------------------------------------------------------------ + if(lab[0]<0 && lab[1]<0 && lab[2]<0) return; // In case of no labels just exit + Int_t ntracks = gAlice->GetMCApp()->GetNtrack(); for (Int_t i=0;i<3;i++){ Int_t label = lab[i]; @@ -277,21 +332,26 @@ static void CheckLabels(Int_t lab[3]) { } } - +*/ static void CheckLabels2(Int_t lab[10]) { //------------------------------------------------------------ // Tries to find mother's labels //------------------------------------------------------------ + AliRunLoader *rl = AliRunLoader::Instance(); + TTree *trK=(TTree*)rl->TreeK(); - Int_t ntracks = gAlice->GetMCApp()->GetNtrack(); - Int_t nlabels =0; - for (Int_t i=0;i<10;i++) if (lab[i]>=0) nlabels++; + 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 && labelGetMCApp()->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 && labelGetMCApp()->Particle(label); + if (part->P() < 0.02) { Int_t m=part->GetFirstMother(); if (m<0) { continue; @@ -300,60 +360,69 @@ static void CheckLabels2(Int_t lab[10]) { 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 && labelGetMCApp()->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 && labelGetMCApp()->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) { - 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; +// 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(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; + } } } } @@ -369,9 +438,9 @@ void AliITSclustererV2::RecPoints2Clusters for (Int_t i=0; iUncheckedAt(i); Float_t lp[5]; - lp[0]=-(-p->GetX()+fYshift[idx]); if (idx<=fLastSPD1) lp[0]*=-1; //SPD1 + lp[0]=-(-p->GetDetLocalX()+fYshift[idx]); if (idx<=fLastSPD1) lp[0]*=-1; //SPD1 lp[1]= -p->GetZ()+fZshift[idx]; - lp[2]=p->GetSigmaX2(); + lp[2]=p->GetSigmaDetLocX2(); lp[3]=p->GetSigmaZ2(); lp[4]=p->GetQ()*36./23333.; //electrons -> ADC Int_t lab[4]; @@ -383,58 +452,8 @@ void AliITSclustererV2::RecPoints2Clusters } } -Int_t AliITSclustererV2::Hits2Clusters(TTree *hTree, TTree *cTree) { - //------------------------------------------------------------ - // This function creates ITS clusters - //------------------------------------------------------------ - if (!gAlice) { - Error("Hits2Clusters","gAlice==0 !"); - return 1; - } - - AliITS *its = (AliITS*)gAlice->GetModule("ITS"); - if (!its) { - Error("Hits2Clusters","Can't find the ITS !"); - return 2; - } - AliITSgeom *geom=its->GetITSgeom(); - Int_t mmax=geom->GetIndexMax(); - - its->InitModules(-1,mmax); - its->FillModules(hTree,0); - - TClonesArray *clusters=new TClonesArray("AliITSclusterV2",1000); - TBranch *branch=cTree->GetBranch("Clusters"); - if (!branch) cTree->Branch("Clusters",&clusters); - else branch->SetAddress(&clusters); - - static TClonesArray *points=its->RecPoints(); - AliITSsimulationFastPoints sim; - Int_t ncl=0; - for (Int_t m=0; mGetModule(m); - sim.CreateFastRecPoints(mod,m,gRandom); - - RecPoints2Clusters(points, m, clusters); - its->ResetRecPoints(); - - ncl+=clusters->GetEntriesFast(); - cTree->Fill(); - clusters->Clear(); - } - - Info("Hits2Clusters","Number of found fast clusters : %d",ncl); - - //cTree->Write(); - - delete clusters; - - return 0; -} - //*********************************** -#ifndef V1 void AliITSclustererV2:: FindCluster(Int_t k,Int_t maxz,AliBin *bins,Int_t &n,Int_t *idx) { @@ -523,20 +542,20 @@ FindClustersSPD(const TClonesArray *digits, TClonesArray *clusters) { for (Int_t iz=zmin; iz<=zmax;iz+=idz) for (Int_t iy=ymin; iy<=ymax;iy+=idy){ // - Int_t ndigits =0; - Double_t y=0.,z=0.,q=0.; + Int_t nodigits =0; + Float_t y=0.,z=0.,q=0.; for (Int_t l=0; lUncheckedAt(idx[l]); if (zmax-zmin>=idz || ymax-ymin>=idy){ if (TMath::Abs( d->GetCoord2()-iy)>0.75*idy) continue; if (TMath::Abs( d->GetCoord1()-iz)>0.75*idz) continue; } - ndigits++; - Double_t qq=d->GetSignal(); + 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; @@ -556,7 +575,6 @@ FindClustersSPD(const TClonesArray *digits, TClonesArray *clusters) { 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++; } @@ -576,7 +594,9 @@ void AliITSclustererV2::FindClustersSPD(AliITSRawStream* input, Int_t kNzBins = fNzSPD + 2; Int_t kNyBins = fNySPD + 2; Int_t kMaxBin = kNzBins * kNyBins; - AliBin* bins = NULL; + AliBin *binsSPD = new AliBin[kMaxBin]; + AliBin *binsSPDInit = new AliBin[kMaxBin]; + AliBin *bins = NULL; // read raw data input stream while (kTRUE) { @@ -610,9 +630,6 @@ void AliITSclustererV2::FindClustersSPD(AliITSRawStream* input, Int_t ymax = ymin; Int_t zmin = (idxBins[0] % kNzBins) - 1; Int_t zmax = zmin; - Float_t y = 0.; - Float_t z = 0.; - Float_t q = 0.; for (Int_t idx = 0; idx < nBins; idx++) { Int_t iy = (idxBins[idx] / kNzBins) - 1; Int_t iz = (idxBins[idx] % kNzBins) - 1; @@ -620,48 +637,73 @@ void AliITSclustererV2::FindClustersSPD(AliITSRawStream* input, if (ymax < iy) ymax = iy; if (zmin > iz) zmin = iz; if (zmax < iz) zmax = iz; - - Float_t qBin = bins[idxBins[idx]].GetQ(); - y += qBin * fYSPD[iy]; - z += qBin * fZSPD[iz]; - q += qBin; } - y /= q; - z /= q; - y -= fHwSPD; - z -= fHlSPD; - - Float_t hit[5]; // y, z, sigma(y)^2, sigma(z)^2, charge - hit[0] = -y-fYshift[iModule]; - if (iModule <= fLastSPD1) hit[0] = -hit[0]; - hit[1] = z+fZshift[iModule]; - hit[2] = fYpitchSPD*fYpitchSPD/12.; - hit[3] = fZ1pitchSPD*fZ1pitchSPD/12.; -// hit[4] = q; - hit[4] = (zmax-zmin+1)*100 + (ymax-ymin+1); - - CheckLabels(label); - Int_t info[3]={0,0,0}; - new (clusters[iModule]->AddrAt(nClusters)) - AliITSclusterV2(label, hit,info); - nClusters++; + + Int_t idy = 0; // max 2 clusters + if ((iModule <= fLastSPD1) &&idy<3) idy=3; + if ((iModule > fLastSPD1) &&idy<4) idy=4; + Int_t idz =3; + for (Int_t iiz=zmin; iiz<=zmax;iiz+=idz) + for (Int_t iiy=ymin; iiy<=ymax;iiy+=idy){ + // + Int_t ndigits =0; + Float_t y=0.,z=0.,q=0.; + for (Int_t idx = 0; idx < nBins; idx++) { + Int_t iy = (idxBins[idx] / kNzBins) - 1; + Int_t iz = (idxBins[idx] % kNzBins) - 1; + if (zmax-zmin>=idz || ymax-ymin>=idy){ + if (TMath::Abs(iy-iiy)>0.75*idy) continue; + if (TMath::Abs(iz-iiz)>0.75*idz) continue; + } + ndigits++; + Float_t qBin = bins[idxBins[idx]].GetQ(); + y += qBin * fYSPD[iy]; + z += qBin * fZSPD[iz]; + q += qBin; + } + if (ndigits==0) continue; + y /= q; + z /= q; + y -= fHwSPD; + z -= fHlSPD; + + Float_t hit[5]; // y, z, sigma(y)^2, sigma(z)^2, charge + hit[0] = -(-y+fYshift[iModule]); + if (iModule <= fLastSPD1) hit[0] = -hit[0]; + hit[1] = -z+fZshift[iModule]; + hit[2] = fYpitchSPD*fYpitchSPD/12.; + hit[3] = fZ1pitchSPD*fZ1pitchSPD/12.; + // hit[4] = q; + hit[4] = (zmax-zmin+1)*100 + (ymax-ymin+1); + // CheckLabels(label); + Int_t info[3]={ymax-ymin+1,zmax-zmin+1,fNlayer[iModule]}; + new (clusters[iModule]->AddrAt(nClusters)) + AliITSclusterV2(label, hit,info); + nClusters++; + } } nClustersSPD += nClusters; - delete bins; + bins = NULL; } if (!next) break; - bins = new AliBin[kMaxBin]; + bins = binsSPD; + memcpy(binsSPD,binsSPDInit,sizeof(AliBin)*kMaxBin); } // 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; + delete [] binsSPD; + Info("FindClustersSPD", "found clusters in ITS SPD: %d", nClustersSPD); } @@ -807,12 +849,14 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, if (dj>maxj) maxj=dj; if (djUncheckedAt(b->GetIndex()); - for (Int_t itrack=0;itrack<10;itrack++){ - Int_t track = (d->GetTracks())[itrack]; - if (track>=0) { - AddLabel(milab, track); + if(digits) { + if (TMath::Abs(di)<2&&TMath::Abs(dj)<2){ + AliITSdigitSDD* d=(AliITSdigitSDD*)digits->UncheckedAt(b->GetIndex()); + for (Int_t itrack=0;itrack<10;itrack++){ + Int_t track = (d->GetTracks())[itrack]; + if (track>=0) { + AddLabel(milab, track); + } } } } @@ -837,10 +881,6 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, } */ - 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; // @@ -859,12 +899,11 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, 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 @@ -878,13 +917,13 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, //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++; } } } @@ -926,6 +965,7 @@ FindClustersSDD(const TClonesArray *digits, TClonesArray *clusters) { delete[] bins[0]; delete[] bins[1]; + } void AliITSclustererV2::FindClustersSDD(AliITSRawStream* input, @@ -937,7 +977,10 @@ void AliITSclustererV2::FindClustersSDD(AliITSRawStream* input, Int_t nClustersSDD = 0; Int_t kNzBins = fNzSDD + 2; Int_t kMaxBin = kNzBins * (fNySDD+2); - AliBin* bins[2] = {NULL, NULL}; + AliBin *binsSDDInit = new AliBin[kMaxBin]; + AliBin *binsSDD1 = new AliBin[kMaxBin]; + AliBin *binsSDD2 = new AliBin[kMaxBin]; + AliBin *bins[2] = {NULL, NULL}; // read raw data input stream while (kTRUE) { @@ -952,25 +995,32 @@ void AliITSclustererV2::FindClustersSDD(AliITSRawStream* input, FindClustersSDD(bins, kMaxBin, kNzBins, NULL, clusters[iModule]); Int_t nClusters = clusters[iModule]->GetEntriesFast(); nClustersSDD += nClusters; - delete[] bins[0]; - delete[] bins[1]; + bins[0] = bins[1] = NULL; } if (!next) break; - bins[0] = new AliBin[kMaxBin]; - bins[1] = new AliBin[kMaxBin]; + bins[0]=binsSDD1; + bins[1]=binsSDD2; + memcpy(binsSDD1,binsSDDInit,sizeof(AliBin)*kMaxBin); + memcpy(binsSDD2,binsSDDInit,sizeof(AliBin)*kMaxBin); } // fill the current digit into the bins array - Int_t iz = input->GetCoord1()+1; - Int_t side = ((iz <= fNzSDD) ? 0 : 1); - iz -= side*fNzSDD; - Int_t index = (input->GetCoord2()+1) * kNzBins + iz; - bins[side][index].SetQ(input->GetSignal()); - bins[side][index].SetMask(1); - bins[side][index].SetIndex(index); + if(input->GetSignal()>=3) { + Int_t iz = input->GetCoord1()+1; + Int_t side = ((iz <= fNzSDD) ? 0 : 1); + iz -= side*fNzSDD; + Int_t index = (input->GetCoord2()+1) * kNzBins + iz; + bins[side][index].SetQ(input->GetSignal()); + bins[side][index].SetMask(1); + bins[side][index].SetIndex(index); + } } + delete[] binsSDD1; + delete[] binsSDD2; + delete[] binsSDDInit; + Info("FindClustersSDD", "found clusters in ITS SDD: %d", nClustersSDD); } @@ -998,8 +1048,14 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, Int_t cused2[3000]; for (Int_t i=0;i<3000;i++) {cnegative[i]=0; cused1[i]=0;} for (Int_t i=0;i<3000;i++) {cpositive[i]=0; cused2[i]=0;} - Short_t pairs[1000][1000]; - memset(pairs,0,sizeof(Short_t)*1000000); + for (Int_t i=0;i<30000;i++){negativepair[i]=positivepair[i]=0;} + static Short_t pairs[1000][1000]; + memset(pairs,0,sizeof(Short_t)*1000000); +// Short_t ** pairs = new Short_t*[1000]; +// for (Int_t i=0; i<1000; i++) { +// pairs[i] = new Short_t[1000]; +// memset(pairs[i],0,sizeof(Short_t)*1000); +// } // // find available pairs // @@ -1415,6 +1471,10 @@ FindClustersSSD(Ali1Dcluster* neg, Int_t nn, } } } + +// for (Int_t i=0; i<1000; i++) delete [] pairs[i]; +// delete [] pairs; + } @@ -1434,9 +1494,9 @@ FindClustersSSD(const TClonesArray *alldigits, TClonesArray *clusters) { 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}; @@ -1471,7 +1531,7 @@ FindClustersSSD(const TClonesArray *alldigits, TClonesArray *clusters) { 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; } @@ -1479,7 +1539,7 @@ FindClustersSSD(const TClonesArray *alldigits, TClonesArray *clusters) { c[*n].SetQ(0.5*q); c[*n].SetNd(nd); (*n)++; - if (*n==MAX) { + if (*n==mMAX) { Error("FindClustersSSD","Too many 1D clusters !"); return; } @@ -1495,7 +1555,7 @@ FindClustersSSD(const TClonesArray *alldigits, TClonesArray *clusters) { 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; } @@ -1505,7 +1565,7 @@ FindClustersSSD(const TClonesArray *alldigits, TClonesArray *clusters) { c[*n].SetLabels(milab); } (*n)++; - if (*n==MAX) { + if (*n==mMAX) { Error("FindClustersSSD","Too many 1D clusters !"); return; } @@ -1537,21 +1597,21 @@ FindClustersSSD(const TClonesArray *alldigits, TClonesArray *clusters) { c[*n].SetNd(nd); c[*n].SetLabels(lab); //Split suspiciously big cluster - if (nd>3) { - c[*n].SetY(y/q-0.5*nd); + if (nd>4 && nd<25) { + 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].SetY(y/q+0.5*nd); + c[*n].SetY(y/q+0.25*nd); c[*n].SetQ(0.5*q); c[*n].SetNd(nd); c[*n].SetLabels(lab); } (*n)++; - if (*n==MAX) { + if (*n==mMAX) { Error("FindClustersSSD","Too many 1D clusters !"); return; } @@ -1566,26 +1626,29 @@ void AliITSclustererV2::FindClustersSSD(AliITSRawStream* input, // 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.; Float_t y = 0.; Int_t nDigits = 0; Int_t prevStrip = -1; Int_t prevFlag = -1; + Int_t prevModule = -1; // read raw data input stream while (kTRUE) { Bool_t next = input->Next(); + if(input->GetSignal()<3 && next) continue; // check if a new cluster starts Int_t strip = input->GetCoord2(); Int_t flag = input->GetCoord1(); - if ((!next || input->IsNewModule() || + 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; } @@ -1593,26 +1656,28 @@ void AliITSclustererV2::FindClustersSSD(AliITSRawStream* input, cluster.SetY(y/q); cluster.SetQ(q); cluster.SetNd(nDigits); + cluster.SetLabels(lab); //Split suspiciously big cluster - if (nDigits > 3) { - cluster.SetY(y/q - 0.5*nDigits); + 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; } Ali1Dcluster& cluster2 = clusters1D[prevFlag][nClusters[prevFlag]++]; - cluster2.SetY(y/q + 0.5*nDigits); + cluster2.SetY(y/q + 0.25*nDigits); cluster2.SetQ(0.5*q); cluster2.SetNd(nDigits); + cluster2.SetLabels(lab); } y = q = 0.; nDigits = 0; } - if (!next || input->IsNewModule()) { - Int_t iModule = input->GetPrevModuleID(); + if (!next || (input->GetModuleID() != prevModule)) { + Int_t iModule = prevModule; // when all data from a module was read, search for clusters if (prevFlag >= 0) { @@ -1620,8 +1685,8 @@ void AliITSclustererV2::FindClustersSSD(AliITSRawStream* input, 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; @@ -1636,84 +1701,10 @@ void AliITSclustererV2::FindClustersSSD(AliITSRawStream* input, nDigits++; prevStrip = strip; prevFlag = flag; - } - - Info("FindClustersSSD", "found clusters in ITS SSD: %d", nClustersSSD); -} - -#else //V1 - -#include "AliITSDetType.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(); - -} + prevModule = input->GetModuleID(); -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(); + Info("FindClustersSSD", "found clusters in ITS SSD: %d", nClustersSSD); } -#endif