X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSClusterFinderV2SPD.cxx;h=135e11574fcfbccea40911d2bfea591c887a2558;hb=412d07b9b5a14e8b3213b5bd138b978197fc9ff5;hp=ae991069f0f5cdbfde8fec15a3a0ca346ad27b33;hpb=ad7f2bfa13b73e2fb13f097a478710c3bc1d47a3;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSClusterFinderV2SPD.cxx b/ITS/AliITSClusterFinderV2SPD.cxx index ae991069f0f..135e11574fc 100644 --- a/ITS/AliITSClusterFinderV2SPD.cxx +++ b/ITS/AliITSClusterFinderV2SPD.cxx @@ -21,6 +21,7 @@ //////////////////////////////////////////////////////////////////////////// +#include #include "AliITSCalibrationSPD.h" #include "AliITSClusterFinderV2SPD.h" #include "AliITSRecPoint.h" @@ -32,6 +33,9 @@ #include #include "AliITSdigitSPD.h" #include "AliITSFOSignalsSPD.h" +#include "AliITSRecPointContainer.h" +#include "AliMagF.h" +#include "AliITSsegmentationSPD.h" ClassImp(AliITSClusterFinderV2SPD) @@ -73,19 +77,22 @@ void AliITSClusterFinderV2SPD::FindRawClusters(Int_t mod){ } //__________________________________________________________________________ -void AliITSClusterFinderV2SPD::RawdataToClusters(AliRawReader* rawReader, TClonesArray** clusters){ +void AliITSClusterFinderV2SPD::RawdataToClusters(AliRawReader* rawReader){ //------------------------------------------------------------ // This function creates ITS clusters from raw data //------------------------------------------------------------ rawReader->Reset(); + fNClusters = 0; //RS AliITSRawStreamSPD inputSPD(rawReader); - FindClustersSPD(&inputSPD, clusters); + FindClustersSPD(&inputSPD); } //__________________________________________________________________________ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,TClonesArray* clusters,Int_t maxBins,Int_t nzbins,Int_t iModule,Bool_t rawdata){ //Cluster finder for SPD (from digits and from rawdata) + const Double_t kmictocm = 1.0e-4; // convert microns to cm. + const Double_t defaultField = 5.0; // default Bz value at which Tan(theta_Lorentz) is given in RecoParam static AliITSRecoParam *repa = NULL; if(!repa){ @@ -97,6 +104,23 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T } const TGeoHMatrix *mT2L=AliITSgeomTGeo::GetTracking2LocalMatrix(iModule); + // Lorentz angle correction + Double_t tanLorentzAngle=0; + AliITSsegmentationSPD *seg = (AliITSsegmentationSPD*)(GetDetTypeRec()->GetSegmentationModel(0)); + Double_t thick = 0.5*kmictocm*seg->Dy(); // Half Thickness in cm + if(repa->GetCorrectLorentzAngleSPD()) { // only if CorrectLorentzAngleSPD required + // here retrieve the value of the field + AliMagF* field = dynamic_cast(TGeoGlobalMagField::Instance()->GetField()); + if (field == 0) { + AliError("Cannot get magnetic field from TGeoGlobalMagField"); + } + else { + Float_t magField = field->SolenoidField(); + tanLorentzAngle=repa->GetTanLorentzAngleHolesSPD() * magField / defaultField ; + } + } + // + if (repa->GetSPDRemoveNoisyFlag()) { // Loop on noisy pixels and reset them AliITSCalibrationSPD *cal = @@ -104,7 +128,7 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T for(Int_t ipix = 0; ipixGetNrBad(); ipix++){ Int_t row, col; cal->GetBadPixel(ipix,row,col); - printf(" module %d row %d col %d \n",iModule,row,col); + //PH printf(" module %d row %d col %d \n",iModule,row,col); Int_t index = (row+1) * nzbins + (col+1); bins[index].SetQ(0); @@ -124,12 +148,21 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T bins[index].SetQ(0); bins[index].SetMask(0xFFFFFFFE); } + AliITSCalibrationSPD *calSparse = (AliITSCalibrationSPD*) fDetTypeRec->GetSPDSparseDeadModel(iModule); + for(Int_t ipix = 0; ipixGetNrBad(); ipix++){ + Int_t row, col; + calSparse->GetBadPixel(ipix,row,col); + Int_t index = (row+1) * nzbins + (col+1); + bins[index].SetQ(0); + bins[index].SetMask(0xFFFFFFFE); + } + } Int_t nclu=0; for(Int_t iBin =0; iBin < maxBins;iBin++){ if(bins[iBin].IsUsed()) continue; - Int_t nBins = 0; + Int_t nBins = 0; Int_t idxBins[200]; FindCluster(iBin,nzbins,bins,nBins,idxBins); if (nBins == 200){ @@ -157,7 +190,7 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T zmin=dig->GetCoord1(); zmax=zmin; } - if(iModule == 24 || iModule == 25) printf("\n"); + //PH if(iModule == 24 || iModule == 25) printf("\n"); for (Int_t idx = 0; idx < nBins; idx++) { Int_t iy; Int_t iz; @@ -200,7 +233,7 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T idy=ymax-ymin+1; idz=zmax-zmin+1; } - + // for(Int_t iiz=zmin; iiz<=zmax;iiz+=idz){ for(Int_t iiy=ymin;iiy<=ymax;iiy+=idy){ @@ -224,7 +257,14 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T } ndigits++; Float_t qBin=0.; - if(rawdata) qBin = bins[idxBins[idx]].GetQ(); + if(rawdata) { + qBin = bins[idxBins[idx]].GetQ(); + if (fRawID2ClusID) { // RS: Register cluster id in raw words list + int rwid = bins[idxBins[idx]].GetRawID(); + if (fRawID2ClusID->GetSize()<=rwid) fRawID2ClusID->Set( (rwid+10)<<1 ); + (*fRawID2ClusID)[rwid] = milab[0] = fNClusters+1; // RS: store clID+1 as a reference to the cluster + } + } if(!rawdata){ AliITSdigitSPD* dig = (AliITSdigitSPD*)digits->UncheckedAt(idxBins[idx]); qBin = (Float_t)dig->GetSignal(); @@ -234,12 +274,17 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T q+= qBin; }// for idx 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 + // Lorentz drift effect in local y + y -= tanLorentzAngle*thick; + // + + Float_t hit[6]; //y,z,sigma(y)^2, sigma(z)^2, charge { Double_t loc[3]={y,0.,z},trk[3]={0.,0.,0.}; mT2L->MasterToLocal(loc,trk); @@ -249,19 +294,24 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T hit[2] = fYpitchSPD*fYpitchSPD/12.; hit[3] = fZ1pitchSPD*fZ1pitchSPD/12.; hit[4] = 1.; + hit[5] = 0.; if(!rawdata) milab[3]=fNdet[iModule]; Int_t info[3] = {ymax-ymin+1,zmax-zmin+1,fNlayer[iModule]}; if(!rawdata){ AliITSRecPoint cl(milab,hit,info); + cl.SetType(nBins); fDetTypeRec->AddRecPoint(cl); } else{ Int_t label[4]={milab[0],milab[1],milab[2],milab[3]}; + AliITSRecPoint cl(label, hit,info); + cl.SetType(nBins); new (clusters->AddrAt(nclu)) - AliITSRecPoint(label, hit,info); + AliITSRecPoint(cl); } nclu++; + fNClusters++; }// for iiy }// for iiz }//end for iBin @@ -269,14 +319,14 @@ Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,T } //__________________________________________________________________________ -void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input, - TClonesArray** clusters) +void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input) { //------------------------------------------------------------ // SPD cluster finder for raw data (this method is called once per event) // Now also fills fast-or fired map //------------------------------------------------------------ - + + AliITSRecPointContainer* rpc = AliITSRecPointContainer::Instance(); Int_t nClustersSPD = 0; Int_t kNzBins = fNzSPD + 2; Int_t kNyBins = fNySPD + 2; @@ -286,6 +336,9 @@ void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input, AliBin* bins = NULL; // read raw data input stream + int countRW = 0; //RS + if (fRawID2ClusID) fRawID2ClusID->Reset(); //RS if array was provided, we shall store the rawID -> ClusterID + // while (kTRUE) { Bool_t next = input->Next(); if (!next || input->IsNewModule()) { @@ -293,8 +346,8 @@ void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input, // when all data from a module was read, search for clusters if (bins) { - clusters[iModule] = new TClonesArray("AliITSRecPoint"); - Int_t nClusters = ClustersSPD(bins,0,clusters[iModule],kMaxBin,kNzBins,iModule,kTRUE); + TClonesArray* clusters = rpc->UncheckedGetClusters(iModule); + Int_t nClusters = ClustersSPD(bins,0,clusters,kMaxBin,kNzBins,iModule,kTRUE); nClustersSPD += nClusters; bins = NULL; } @@ -304,20 +357,22 @@ void AliITSClusterFinderV2SPD::FindClustersSPD(AliITSRawStreamSPD* input, memcpy(binsSPD,binsSPDInit,sizeof(AliBin)*kMaxBin); } - if (next) { + if (next && bins) { // fill the current digit into the bins array Int_t index = (input->GetCoord2()+1) * kNzBins + (input->GetCoord1()+1); bins[index].SetIndex(index); bins[index].SetQ(1); bins[index].SetMask(1); + bins[index].SetRawID(countRW); //RS register raw id } + countRW++; //RS } delete [] binsSPDInit; delete [] binsSPD; - // AliDebug(1,Form("found clusters in ITS SPD: %d", nClustersSPD)); - Info("FindClustersSPD", "found clusters in ITS SPD: %d", nClustersSPD); + AliDebug(1,Form("found clusters in ITS SPD: %d", nClustersSPD)); + // Fill the FastOr fired map for (UInt_t eq=0; eq<20; eq++) {