X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSClusterFinderSSD.cxx;h=f91ec692764943653ef35f8944d5a3123b4545c4;hb=c9eeb00e46f330cb5a1583baac9525f14a3fc6ce;hp=aab672ab6dff0bcfe89ac849d143c5f6ad2a77a7;hpb=add43cb31c200ff17370f3498eb1738b8b5d7127;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSClusterFinderSSD.cxx b/ITS/AliITSClusterFinderSSD.cxx index aab672ab6df..f91ec692764 100644 --- a/ITS/AliITSClusterFinderSSD.cxx +++ b/ITS/AliITSClusterFinderSSD.cxx @@ -13,6 +13,11 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +/************************************************************************** + * The package was revised and changed by Boris Batiounia in the time * + * period of March - June 2001 * + **************************************************************************/ + #include #include #include "AliRun.h" @@ -25,6 +30,7 @@ #include "AliITSclusterSSD.h" #include "AliITSpackageSSD.h" #include "AliITSsegmentation.h" +#include "AliITSgeom.h" const Bool_t AliITSClusterFinderSSD::fgkSIDEP=kTRUE; const Bool_t AliITSClusterFinderSSD::fgkSIDEN=kFALSE; @@ -35,55 +41,52 @@ ClassImp(AliITSClusterFinderSSD) //____________________________________________________________________ // // Constructor -//____________________________________________________________________ -// - - -AliITSClusterFinderSSD::AliITSClusterFinderSSD(AliITSsegmentation *seg, TClonesArray *digits) -{ -//Standard constructor - - fSegmentation=seg; - fDigits=digits; - - fMap = new AliITSMapA1(fSegmentation,fDigits); - - fITS=(AliITS*)gAlice->GetModule("ITS"); - - fClusterP = new TClonesArray ("AliITSclusterSSD",200); - fNClusterP =0; - - fClusterN= new TClonesArray ("AliITSclusterSSD",200); - fNClusterN =0; - - fPackages = new TClonesArray ("AliITSpackageSSD",200); //packages - fNPackages = 0; - - - fDigitsIndexP = new TArrayI(300); - fNDigitsP = 0; - - fDigitsIndexN = new TArrayI(300); - fNDigitsN = 0; - - //SetAlpha1(1000); - //SetAlpha2(1000); - //SetAlpha3(1000); - - - fPitch = fSegmentation->Dpx(0); - Float_t StereoP,StereoN; - fSegmentation->Angles(StereoP,StereoN); - fTanP=TMath::Tan(StereoP); - fTanN=TMath::Tan(StereoN); - - fPNsignalRatio=7./8.; // warning: hard-wired number - +//______________________________________________________________________ +AliITSClusterFinderSSD::AliITSClusterFinderSSD(){ + //Default constructor + + fSegmentation = 0; + fDigits = 0; + fMap = 0; + fITS = (AliITS*)gAlice->GetModule("ITS"); + fClusterP = 0; + fNClusterP =0; + fClusterN = 0; + fNClusterN = 0; + fPackages = 0; + fNPackages = 0; + fDigitsIndexP = 0; + fNDigitsP = 0; + fDigitsIndexN = 0; + fNDigitsN = 0; + fPitch = 0; + fPNsignalRatio= 0; } - -//------------------------------------------------------- -AliITSClusterFinderSSD::~AliITSClusterFinderSSD() { -// Default destructor +//______________________________________________________________________} +AliITSClusterFinderSSD::AliITSClusterFinderSSD(AliITSsegmentation *seg, + TClonesArray *digits){ + //Standard constructor + + fSegmentation = seg; + fDigits = digits; + fMap = new AliITSMapA1(fSegmentation,fDigits); + fITS = (AliITS*)gAlice->GetModule("ITS"); + fClusterP = new TClonesArray ("AliITSclusterSSD",200); + fNClusterP = 0; + fClusterN = new TClonesArray ("AliITSclusterSSD",200); + fNClusterN = 0; + fPackages = new TClonesArray ("AliITSpackageSSD",200); //packages + fNPackages = 0; + fDigitsIndexP = new TArrayI(300); + fNDigitsP = 0; + fDigitsIndexN = new TArrayI(300); + fNDigitsN = 0; + fPitch = fSegmentation->Dpx(0); + fPNsignalRatio= 7./8.; // warning: hard-wired number +} +//______________________________________________________________________ +AliITSClusterFinderSSD::~AliITSClusterFinderSSD(){ + // Default destructor delete fClusterP; delete fClusterN; @@ -91,611 +94,490 @@ AliITSClusterFinderSSD::~AliITSClusterFinderSSD() { delete fDigitsIndexP; delete fDigitsIndexN; delete fMap; - } +//______________________________________________________________________ +void AliITSClusterFinderSSD::InitReconstruction(){ + // initialization of the cluster finder -//------------------------------------------------------- -void AliITSClusterFinderSSD::InitReconstruction() -{ -// initialization of the cluster finder + register Int_t i; //iterator - register Int_t i; //iterator - - for (i=0;iRemoveAt(i); - } - fNClusterP =0; - for (i=0;iRemoveAt(i); - } - fNClusterN=0; - - for (i=0;iRemoveAt(i); - } - - fNPackages = 0; - fNDigitsP=0; - fNDigitsN=0; - - Float_t StereoP,StereoN; - fSegmentation->Angles(StereoP,StereoN); - - CalcStepFactor (StereoP,StereoN); - - if (debug) cout<<"fSFF = "<RemoveAt(i); + fNClusterP =0; + for (i=0;iRemoveAt(i); + fNClusterN=0; + for (i=0;iRemoveAt(i); + fNPackages = 0; + fNDigitsP = 0; + fNDigitsN = 0; + Float_t StereoP,StereoN; + fSegmentation->Angles(StereoP,StereoN); + CalcStepFactor(StereoP,StereoN); + if (debug) cout<<"fSFF = "<FillMap(); - FillDigitsIndex(); - SortDigits(); - FindNeighbouringDigits(); //ad. 2 - //SeparateOverlappedClusters(); //ad. 3 - ClustersToPackages(); //ad. 4 - AliITSRecPoint rnew; - fMap->ClearMap(); +//______________________________________________________________________ +void AliITSClusterFinderSSD::FindRawClusters(Int_t module){ + // This function findes out all clusters belonging to one module + // 1. Zeroes all space after previous module reconstruction + // 2. Finds all neighbouring digits, create clusters + // 3. If necesery, resolves for each group of neighbouring digits + // how many clusters creates it. + // 4. Colculate the x and z coordinate + Int_t lay, lad, detect; + AliITSgeom *geom = fITS->GetITSgeom(); + + geom->GetModuleId(module,lay, lad, detect); + if ( lay == 6 ) ((AliITSsegmentationSSD*)fSegmentation)->SetLayer(6); + if ( lay == 5 ) ((AliITSsegmentationSSD*)fSegmentation)->SetLayer(5); + + InitReconstruction(); //ad. 1 + fMap->FillMap(); + FillDigitsIndex(); + SortDigits(); + FindNeighbouringDigits(); //ad. 2 + //SeparateOverlappedClusters(); //ad. 3 + ClustersToPackages(); //ad. 4 + fMap->ClearMap(); } - - -//------------------------------------------------- -void AliITSClusterFinderSSD::FindNeighbouringDigits() -{ -//If there are any digits on this side, create 1st Cluster, -// add to it this digit, and increment number of clusters - - - register Int_t i; - - - if ((fNDigitsP>0 ) && (fNDigitsN > 0 )) { - - Int_t currentstripNo; - Int_t *dbuffer = new Int_t [300]; //buffer for strip numbers - Int_t dnumber; //curent number of digits in buffer - TArrayI &lDigitsIndexP = *fDigitsIndexP; - TArrayI &lDigitsIndexN = *fDigitsIndexN; - TObjArray &lDigits = *(Digits()); - TClonesArray &lClusterP = *fClusterP; - TClonesArray &lClusterN = *fClusterN; - - //process P side - dnumber = 1; - dbuffer[0]=lDigitsIndexP[0]; - //If next digit is a neighbour of previous, adds to last cluster this digit - for (i=1; i - GetStripNumber(); - //check if it is a neighbour of a previous one - if ( (((AliITSdigitSSD*)lDigits[lDigitsIndexP[i-1]])->GetStripNumber()) - == (currentstripNo-1) ) dbuffer[dnumber++]=lDigitsIndexP[i]; - else { - //create a new one side cluster - new(lClusterP[fNClusterP++]) AliITSclusterSSD(dnumber,dbuffer,Digits(),fgkSIDEP); - dbuffer[0]=lDigitsIndexP[i]; - dnumber = 1; - } - } // end loop over fNDigitsP - new(lClusterP[fNClusterP++]) AliITSclusterSSD(dnumber,dbuffer,Digits(),fgkSIDEP); - - - //process N side - //for comments, see above - dnumber = 1; - dbuffer[0]=lDigitsIndexN[0]; - //If next digit is a neighbour of previous, adds to last cluster this digit - for (i=1; i +//______________________________________________________________________ +void AliITSClusterFinderSSD::FindNeighbouringDigits(){ + //If there are any digits on this side, create 1st Cluster, + // add to it this digit, and increment number of clusters + register Int_t i; + + if ((fNDigitsP>0 ) && (fNDigitsN > 0 )) { + Int_t currentstripNo; + Int_t *dbuffer = new Int_t [300]; //buffer for strip numbers + Int_t dnumber; //curent number of digits in buffer + TArrayI &lDigitsIndexP = *fDigitsIndexP; + TArrayI &lDigitsIndexN = *fDigitsIndexN; + TObjArray &lDigits = *(Digits()); + TClonesArray &lClusterP = *fClusterP; + TClonesArray &lClusterN = *fClusterN; + //process P side + dnumber = 1; + dbuffer[0]=lDigitsIndexP[0]; + //If next digit is a neigh. of previous, adds to last clust. this digit + for (i=1; i + GetStripNumber(); + //check if it is a neighbour of a previous one + if((((AliITSdigitSSD*)lDigits[lDigitsIndexP[i-1]])-> + GetStripNumber()) + == (currentstripNo-1) ) dbuffer[dnumber++]=lDigitsIndexP[i]; + else{ + //create a new one side cluster + new(lClusterP[fNClusterP++]) AliITSclusterSSD(dnumber,dbuffer, + Digits(), + fgkSIDEP); + dbuffer[0]=lDigitsIndexP[i]; + dnumber = 1; + } // end if else + } // end loop over fNDigitsP + new(lClusterP[fNClusterP++]) AliITSclusterSSD(dnumber,dbuffer, + Digits(),fgkSIDEP); + //process N side + //for comments, see above + dnumber = 1; + dbuffer[0]=lDigitsIndexN[0]; + //If next digit is a neigh. of previous, adds to last clust. this digit + for (i=1; i GetStripNumber(); - if ( (((AliITSdigitSSD*)lDigits[lDigitsIndexN[i-1]])->GetStripNumber()) - == (currentstripNo-1) ) dbuffer[dnumber++]=lDigitsIndexN[i]; - else { - new(lClusterN[fNClusterN++]) AliITSclusterSSD(dnumber,dbuffer,Digits(),fgkSIDEN); - dbuffer[0]=lDigitsIndexN[i]; - dnumber = 1; - } - } // end loop over fNDigitsN - new(lClusterN[fNClusterN++]) AliITSclusterSSD(dnumber,dbuffer,Digits(),fgkSIDEN); - delete [] dbuffer; - - } // end condition on NDigits - - if (debug) cout<<"\n Found clusters: fNClusterP = "<GetNumOfDigits())==1) continue; - if (( ((AliITSclusterSSD*)(*fClusterP)[i])->GetNumOfDigits())==2) continue; + if ( (((AliITSdigitSSD*)lDigits[lDigitsIndexN[i-1]])-> + GetStripNumber()) + == (currentstripNo-1) ) dbuffer[dnumber++]=lDigitsIndexN[i]; + else { + new(lClusterN[fNClusterN++]) AliITSclusterSSD(dnumber,dbuffer, + Digits(), + fgkSIDEN); + dbuffer[0]=lDigitsIndexN[i]; + dnumber = 1; + } // end if else + } // end loop over fNDigitsN + new(lClusterN[fNClusterN++]) AliITSclusterSSD(dnumber,dbuffer, + Digits(),fgkSIDEN); + delete [] dbuffer; + + } // end condition on NDigits + + if (debug) cout<<"\n Found clusters: fNClusterP = "< + GetNumOfDigits())==1) continue; + if (( ((AliITSclusterSSD*)(*fClusterP)[i])-> + GetNumOfDigits())==2) continue; Int_t nj=(((AliITSclusterSSD*)(*fClusterP)[i])->GetNumOfDigits()-1); - for (Int_t j=1; jGetDigitSignal(j); signal0=((AliITSclusterSSD*)(*fClusterP)[i])->GetDigitSignal(j-1); signal2=((AliITSclusterSSD*)(*fClusterP)[i])->GetDigitSignal(j+1); //if signal is less then factor*signal of its neighbours - if ( (signal1<(factor*signal0)) && (signal1<(factor*signal2)) ) - { - (*splitlist)[numerofsplits++]=j; - } - } // end loop over number of digits - //split this cluster if necessary - if(numerofsplits>0) SplitCluster(splitlist,numerofsplits,i,fgkSIDEP); - numerofsplits=0; - - //in signed places (splitlist) - } // end loop over clusters on Pside - - for (i=0;iGetNumOfDigits())==1) continue; - if (( ((AliITSclusterSSD*)(*fClusterN)[i])->GetNumOfDigits())==2) continue; - Int_t nj=(((AliITSclusterSSD*)(*fClusterN)[i])->GetNumOfDigits()-1); - for (Int_t j=1; j0) SplitCluster(splitlist,numerofsplits,i,fgkSIDEP); + numerofsplits=0; + //in signed places (splitlist) + } // end loop over clusters on Pside + + for (i=0;i + GetNumOfDigits())==1) continue; + if (( ((AliITSclusterSSD*)(*fClusterN)[i])-> + GetNumOfDigits())==2) continue; + Int_t nj=(((AliITSclusterSSD*)(*fClusterN)[i])->GetNumOfDigits()-1); + for (Int_t j=1; jGetDigitSignal(j); signal0=((AliITSclusterSSD*)(*fClusterN)[i])->GetDigitSignal(j-1); signal2=((AliITSclusterSSD*)(*fClusterN)[i])->GetDigitSignal(j+1); //if signal is less then factor*signal of its neighbours if ( (signal1<(factor*signal0)) && (signal1<(factor*signal2)) ) - (*splitlist)[numerofsplits++]=j; - } // end loop over number of digits - //split this cluster into more clusters - if(numerofsplits>0) SplitCluster(splitlist,numerofsplits,i,fgkSIDEN); - numerofsplits=0; //in signed places (splitlist) - } // end loop over clusters on Nside - - delete splitlist; + (*splitlist)[numerofsplits++]=j; + } // end loop over number of digits + //split this cluster into more clusters + if(numerofsplits>0) SplitCluster(splitlist,numerofsplits,i,fgkSIDEN); + numerofsplits=0; + //in signed places (splitlist) + } // end loop over clusters on Nside + + delete splitlist; } - -//------------------------------------------------------- -void AliITSClusterFinderSSD::SplitCluster(TArrayI *list, Int_t nsplits, Int_t index, Bool_t side) -{ - //This function splits one side cluster into more clusters - //number of splits is defined by "nsplits" - //Place of splits are defined in the TArray "list" - - // For further optimisation: Replace this function by two - // specialised ones (each for one side) - // save one "if" - - //For comlete comments see AliITSclusterSSD::SplitCluster - - - register Int_t i; //iterator - - AliITSclusterSSD* curentcluster; - Int_t *tmpdigits = new Int_t[100]; - Int_t NN; - // side true means P side - if (side) { - curentcluster =((AliITSclusterSSD*)((*fClusterP)[index])) ; - for (i = nsplits; i>0 ;i--) { - NN=curentcluster->SplitCluster((*list)[(i-1)],tmpdigits); - new ((*fClusterP)[fNClusterP]) AliITSclusterSSD(NN,tmpdigits,Digits(),side); - ( (AliITSclusterSSD*)((*fClusterP)[fNClusterP]) )-> +//______________________________________________________________________ +void AliITSClusterFinderSSD::SplitCluster(TArrayI *list, Int_t nsplits, + Int_t index, Bool_t side){ + //This function splits one side cluster into more clusters + //number of splits is defined by "nsplits" + //Place of splits are defined in the TArray "list" + // For further optimisation: Replace this function by two + // specialised ones (each for one side) + // save one "if" + //For comlete comments see AliITSclusterSSD::SplitCluster + register Int_t i; //iterator + AliITSclusterSSD* curentcluster; + Int_t *tmpdigits = new Int_t[100]; + Int_t NN; + + // side true means P side + if (side) { + curentcluster =((AliITSclusterSSD*)((*fClusterP)[index])) ; + for (i = nsplits; i>0 ;i--) { + NN=curentcluster->SplitCluster((*list)[(i-1)],tmpdigits); + new ((*fClusterP)[fNClusterP]) AliITSclusterSSD(NN,tmpdigits, + Digits(),side); + ( (AliITSclusterSSD*)((*fClusterP)[fNClusterP]) )-> SetLeftNeighbour(kTRUE); - //if left cluster had neighbour on the right before split - //new should have it too - if ( curentcluster->GetRightNeighbour() ) - ( (AliITSclusterSSD*)((*fClusterP)[fNClusterP]) )-> + //if left cluster had neighbour on the right before split + //new should have it too + if ( curentcluster->GetRightNeighbour() ) + ( (AliITSclusterSSD*)((*fClusterP)[fNClusterP]) )-> SetRightNeighbour(kTRUE); - else curentcluster->SetRightNeighbour(kTRUE); - fNClusterP++; - } // end loop over nplits - } else { - curentcluster =((AliITSclusterSSD*)((*fClusterN)[index])); - for (i = nsplits; i>0 ;i--) { - NN=curentcluster->SplitCluster((*list)[(i-1)],tmpdigits); - new ((*fClusterN)[fNClusterN]) AliITSclusterSSD(NN,tmpdigits,Digits(),side); - ((AliITSclusterSSD*)((*fClusterN)[fNClusterN]))-> + else curentcluster->SetRightNeighbour(kTRUE); + fNClusterP++; + } // end loop over nplits + } else { + curentcluster =((AliITSclusterSSD*)((*fClusterN)[index])); + for (i = nsplits; i>0 ;i--) { + NN=curentcluster->SplitCluster((*list)[(i-1)],tmpdigits); + new ((*fClusterN)[fNClusterN]) AliITSclusterSSD(NN,tmpdigits, + Digits(),side); + ((AliITSclusterSSD*)((*fClusterN)[fNClusterN]))-> SetRightNeighbour(kTRUE); - if (curentcluster->GetRightNeighbour()) - ( (AliITSclusterSSD*)( (*fClusterN)[fNClusterN]) )-> + if (curentcluster->GetRightNeighbour()) + ( (AliITSclusterSSD*)( (*fClusterN)[fNClusterN]) )-> SetRightNeighbour(kTRUE); - else curentcluster->SetRightNeighbour(kTRUE); - fNClusterN++; - } // end loop over nplits - } // end if side - delete []tmpdigits; - + else curentcluster->SetRightNeighbour(kTRUE); + fNClusterN++; + } // end loop over nplits + } // end if side + delete []tmpdigits; } - - -//------------------------------------------------- -Int_t AliITSClusterFinderSSD::SortDigitsP(Int_t start, Int_t end) -{ -// sort digits on the P side - - - Int_t right; - Int_t left; - if (start != (end - 1) ) - { - left=this->SortDigitsP(start,(start+end)/2); - right=this->SortDigitsP((start+end)/2,end); - return (left || right); - } - else - { - left = ((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexP)[start]]))->GetStripNumber(); - right= ((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexP)[end]]))->GetStripNumber(); - if( left > right ) - { - Int_t tmp = (*fDigitsIndexP)[start]; - (*fDigitsIndexP)[start]=(*fDigitsIndexP)[end]; - (*fDigitsIndexP)[end]=tmp; - return 1; - } - else return 0; - } +//______________________________________________________________________ +Int_t AliITSClusterFinderSSD::SortDigitsP(Int_t start, Int_t end){ + // sort digits on the P side + Int_t right; + Int_t left; + + if (start != (end - 1) ){ + left=this->SortDigitsP(start,(start+end)/2); + right=this->SortDigitsP((start+end)/2,end); + return (left || right); + }else{ + left = ((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexP)[start]]))-> + GetStripNumber(); + right= ((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexP)[end]]))-> + GetStripNumber(); + if( left > right ){ + Int_t tmp = (*fDigitsIndexP)[start]; + (*fDigitsIndexP)[start]=(*fDigitsIndexP)[end]; + (*fDigitsIndexP)[end]=tmp; + return 1; + }else return 0; + } // end if } - - -//-------------------------------------------------- - -Int_t AliITSClusterFinderSSD::SortDigitsN(Int_t start, Int_t end) -{ -// sort digits on the N side - - Int_t right; - Int_t left; - if (start != (end - 1)) - { - left=this->SortDigitsN(start,(start+end)/2); - right=this->SortDigitsN((start+end)/2,end); - return (left || right); - } - else - { - left =((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexN)[start]]))->GetStripNumber(); - right=((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexN)[end]]))->GetStripNumber(); - if ( left > right ) - { - Int_t tmp = (*fDigitsIndexN)[start]; - (*fDigitsIndexN)[start]=(*fDigitsIndexN)[end]; - (*fDigitsIndexN)[end]=tmp; - return 1; - }else return 0; - } +//______________________________________________________________________ +Int_t AliITSClusterFinderSSD::SortDigitsN(Int_t start, Int_t end){ + // sort digits on the N side + Int_t right; + Int_t left; + + if (start != (end - 1)){ + left=this->SortDigitsN(start,(start+end)/2); + right=this->SortDigitsN((start+end)/2,end); + return (left || right); + }else{ + left =((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexN)[start]]))-> + GetStripNumber(); + right=((AliITSdigitSSD*)((*(Digits()))[(*fDigitsIndexN)[end]]))-> + GetStripNumber(); + if ( left > right ){ + Int_t tmp = (*fDigitsIndexN)[start]; + (*fDigitsIndexN)[start]=(*fDigitsIndexN)[end]; + (*fDigitsIndexN)[end]=tmp; + return 1; + }else return 0; + } // end if } - - -//------------------------------------------------ -void AliITSClusterFinderSSD::FillDigitsIndex() -{ - //Fill the indexes of the clusters belonging to a given ITS module - - Int_t PNs=0, NNs=0; - Int_t tmp,bit,k; - Int_t N; - Int_t i; - - N = fDigits->GetEntriesFast(); - - Int_t* PSidx = new Int_t [N*sizeof(Int_t)]; - Int_t* NSidx = new Int_t [N*sizeof(Int_t)]; - if (fDigitsIndexP==NULL) fDigitsIndexP = new TArrayI(N); - if (fDigitsIndexN==NULL) fDigitsIndexN = new TArrayI(N); - - AliITSdigitSSD *dig; - - for ( i = 0 ; i< N; i++ ) { - dig = (AliITSdigitSSD*)GetDigit(i); - if(dig->IsSideP()) { - bit=1; - tmp=dig->GetStripNumber(); - // I find this totally unnecessary - it's just a - // CPU consuming double check - for( k=0;kAddAt(i,fNDigitsP++); - PSidx[PNs++]=tmp; - } - } else { - bit=1; - tmp=dig->GetStripNumber(); - // same as above - for( k=0;kAddAt(i,fNDigitsN++); - NSidx[NNs++] =tmp; - } - } - } - - delete [] PSidx; - delete [] NSidx; - - if (debug) cout<<"Digits : P = "<AddAt(i,fNDigitsP++); + PSidx[PNs++]=tmp; + } // end if bit + } else { + bit=1; + tmp=dig->GetStripNumber(); + // same as above + for( k=0;kAddAt(i,fNDigitsN++); + NSidx[NNs++] =tmp; + } // end if bit + } // end if + } // end for i + + delete [] PSidx; + delete [] NSidx; + + if (debug) cout<<"Digits : P = "<GetTotalSignal(); - for (j2=0;j2GetPosition(); - //Int_t NxN = currentN->GetNumOfDigits(); - //cout<<"ClusterToP:New NxN,xN ="<GetTotalSignal(); - //cout<<"ClusterToP: signalP,signalN ="<GetPosition(); + Float_t signalP = currentP->GetTotalSignal(); + for (j2=0;j2GetPosition(); + Float_t signalN = currentN->GetTotalSignal(); + CreateNewRecPoint(xP,1,xN,1,signalP,signalN,currentP,currentN, + 0.75); + } // end for j2 + } // end for j1 + + delete [] oneSclP; + delete [] oneSclN; } - - -//------------------------------------------------------ -Bool_t AliITSClusterFinderSSD:: -CreateNewRecPoint(Float_t P, Float_t dP, Float_t N, Float_t dN, - Float_t SigP,Float_t SigN, - AliITSclusterSSD *clusterP, AliITSclusterSSD *clusterN, - Stat_t prob) -{ -// create the recpoints - const Float_t kADCtoKeV = 2.16; - // 50 ADC units -> 30000 e-h pairs; 1e-h pair -> 3.6e-3 KeV; - // 1 ADC unit -> (30000/50)*3.6e-3 = 2.16 KeV - const Float_t kconv = 1.0e-4; - - const Float_t kRMSx = 20.0*kconv; - const Float_t kRMSz = 800.0*kconv; - - Int_t stripP, stripN; - Int_t n=0; - Int_t *tr; - if (GetCrossing(P,N)) { - - GetCrossingError(dP,dN); - AliITSRawClusterSSD cnew; - Int_t nstripsP=clusterP->GetNumOfDigits(); - Int_t nstripsN=clusterN->GetNumOfDigits(); - //Float_t signalP=clusterP->GetTotalSignal(); - //Float_t signalN=clusterN->GetTotalSignal(); - - Float_t signal = 0; - Float_t dedx = 0; - if(SigP>SigN) { - signal = SigP; - dedx = SigP*kADCtoKeV; - }else{ - signal = SigN; - dedx = SigN*kADCtoKeV; - } - Float_t signalCut = TMath::Abs((SigP-SigN)/signal); - - //cnew.fSignalP=signalP; - //cnew.fSignalN=signalN; +//______________________________________________________________________ +Bool_t AliITSClusterFinderSSD::CreateNewRecPoint(Float_t P,Float_t dP, + Float_t N, Float_t dN, + Float_t SigP,Float_t SigN, + AliITSclusterSSD *clusterP, + AliITSclusterSSD *clusterN, + Stat_t prob){ + // create the recpoints + const Float_t kADCtoKeV = 2.16; + // 50 ADC units -> 30000 e-h pairs; 1e-h pair -> 3.6e-3 KeV; + // 1 ADC unit -> (30000/50)*3.6e-3 = 2.16 KeV + const Float_t kconv = 1.0e-4; + const Float_t kRMSx = 20.0*kconv; + const Float_t kRMSz = 800.0*kconv; + Int_t n=0; + Int_t *tr; + Int_t NTracks; + + if (GetCrossing(P,N)) { + //GetCrossingError(dP,dN); + AliITSRawClusterSSD cnew; + Int_t nstripsP=clusterP->GetNumOfDigits(); + Int_t nstripsN=clusterN->GetNumOfDigits(); + Float_t signal = 0; + Float_t dedx = 0; + if(SigP>SigN) { + signal = SigP; + dedx = SigP*kADCtoKeV; + }else{ + signal = SigN; + dedx = SigN*kADCtoKeV; + } // end if SigP>SigN + tr = (Int_t*) clusterP->GetTracks(n); + NTracks = clusterP->GetNTracks(); cnew.fSignalP=SigP; cnew.fSignalN=SigN; cnew.fMultiplicity=nstripsP; cnew.fMultiplicityN=nstripsN; - cnew.fQErr=signalCut; - - //fITS->AddCluster(2,&cnew); - - if(signalCut<0.18) fITS->AddCluster(2,&cnew); - // the cut of the signals difference in P and N sides to - // remove the "ghosts" - - fSegmentation->GetPadIxz(P,N,stripP,stripN); - - //cout<<"NewRec: P,N microns,stripP,stripN ="<GetTracks(n); - //cout<<"!!!! ntr,tr0,tr1,tr2 ="<AddCluster(2,&cnew); AliITSRecPoint rnew; rnew.SetX(P*kconv); rnew.SetZ(N*kconv); @@ -703,154 +585,98 @@ CreateNewRecPoint(Float_t P, Float_t dP, Float_t N, Float_t dN, rnew.SetdEdX(dedx); rnew.SetSigmaX2( kRMSx* kRMSx); rnew.SetSigmaZ2( kRMSz* kRMSz); - //rnew.SetSigmaX2(1); //This has to be verified - //rnew.SetSigmaZ2(1); //This has to be verified rnew.fTracks[0]=tr[0]; rnew.fTracks[1]=tr[1]; rnew.fTracks[2]=tr[2]; - - //fITS->AddRecPoint(rnew); - - if(signalCut<0.18) fITS->AddRecPoint(rnew); - // the cut of the signals difference in P and N sides to - // remove the "ghosts" - + fITS->AddRecPoint(rnew); return kTRUE; - } - return kFALSE; + } // end if + return kFALSE; } - - -//------------------------------------------------------ -void AliITSClusterFinderSSD::CalcStepFactor(Float_t Psteo, Float_t Nsteo ) -{ -// calculate the step factor for matching clusters - - - // 95 is the pitch, 4000 - dimension along z ? - - - Float_t dz=fSegmentation->Dz(); - - fSFF = ( (Int_t) (Psteo*dz/fPitch ) );// +1; - fSFB = ( (Int_t) (Nsteo*dz/fPitch ) );// +1; - +//______________________________________________________________________ +void AliITSClusterFinderSSD::CalcStepFactor(Float_t Psteo, Float_t Nsteo){ + // calculate the step factor for matching clusters + // 95 is the pitch, 4000 - dimension along z ? + Float_t dz=fSegmentation->Dz(); + + fSFF = ( (Int_t) (Psteo*dz/fPitch ) );// +1; + fSFB = ( (Int_t) (Nsteo*dz/fPitch ) );// +1; } - - -//----------------------------------------------------------- -AliITSclusterSSD* AliITSClusterFinderSSD::GetPSideCluster(Int_t idx) -{ -// get P side clusters - - - - - if((idx<0)||(idx>=fNClusterP)) - { - printf("AliITSClusterFinderSSD::GetPSideCluster : index out of range\n"); - return 0; - } - else - { - return (AliITSclusterSSD*)((*fClusterP)[idx]); - } +//______________________________________________________________________ +AliITSclusterSSD* AliITSClusterFinderSSD::GetPSideCluster(Int_t idx){ + // get P side clusters + + if((idx<0)||(idx>=fNClusterP)){ + printf("AliITSClusterFinderSSD::GetPSideCluster: index out of range\n"); + return 0; + }else{ + return (AliITSclusterSSD*)((*fClusterP)[idx]); + } // end if } - -//------------------------------------------------------- -AliITSclusterSSD* AliITSClusterFinderSSD::GetNSideCluster(Int_t idx) -{ -// get N side clusters - - if((idx<0)||(idx>=fNClusterN)) - { - printf("AliITSClusterFinderSSD::GetNSideCluster : index out of range\n"); - return 0; - } - else - { - return (AliITSclusterSSD*)((*fClusterN)[idx]); - } +//______________________________________________________________________ +AliITSclusterSSD* AliITSClusterFinderSSD::GetNSideCluster(Int_t idx){ + // get N side clusters + + if((idx<0)||(idx>=fNClusterN)){ + printf("AliITSClusterFinderSSD::GetNSideCluster: index out of range\n"); + return 0; + }else{ + return (AliITSclusterSSD*)((*fClusterN)[idx]); + } // end if } +//______________________________________________________________________ +AliITSclusterSSD* AliITSClusterFinderSSD::GetCluster(Int_t idx, Bool_t side){ + // Get cluster -//-------------------------------------------------------- -AliITSclusterSSD* AliITSClusterFinderSSD::GetCluster(Int_t idx, Bool_t side) -{ -// Get cluster - - return (side) ? GetPSideCluster(idx) : GetNSideCluster(idx); + return (side) ? GetPSideCluster(idx) : GetNSideCluster(idx); } +//______________________________________________________________________ +Bool_t AliITSClusterFinderSSD::GetCrossing (Float_t &P, Float_t &N){ + // get crossing + // This function was rivised and changed by Boris Batiounia in March 2001 + Float_t Dx = fSegmentation->Dx(); // detector size in x direction, microns + Float_t Dz = fSegmentation->Dz(); // detector size in z direction, microns + Float_t xL; // x local coordinate + Float_t zL; // z local coordinate + Float_t x; // x = xL + Dx/2 + Float_t z; // z = zL + Dz/2 + Float_t xP; // x coordinate in the P side from the first P strip + Float_t xN; // x coordinate in the N side from the first N strip + Float_t StereoP,StereoN; -//_______________________________________________________________________ - -Bool_t AliITSClusterFinderSSD::GetCrossing (Float_t &P, Float_t &N) -{ -// get crossing - - Float_t Dx = fSegmentation->Dx(); // detector size in x direction, microns - Float_t Dz = fSegmentation->Dz(); // detector size in z direction, microns - - Float_t xL; // x local coordinate - Float_t zL; // z local coordinate - Float_t x; // x = xL + Dx/2 - Float_t z; // z = zL + Dz/2 - Float_t xP; // x coordinate in the P side from the first P strip - Float_t xN; // x coordinate in the N side from the first N strip - Float_t kP = fTanP; // Tangent of 0.0075 mrad - Float_t kN = fTanN; // Tangent of 0.0275 mrad - - //cout<<"1 GetCros: strP,srtN,fPitch,Dx ="<Dx()<Angles(StereoP,StereoN); + fTanP=TMath::Tan(StereoP); + fTanN=TMath::Tan(StereoN); + Float_t kP = fTanP; // Tangent of 0.0075 mrad + Float_t kN = fTanN; // Tangent of 0.0275 mrad P *= fPitch; N *= fPitch; + xP = N; // change the mistake for the P/N xN = P; // coordinates correspondence in this function - - //cout<<"2 GetCross: xP,xN,fTanP,fTanN ="< Dx/2 || TMath::Abs(zL) > Dz/2) return kFALSE; + // Check that xL and zL are inside the detector for the // correspondent xP and xN coordinates return kTRUE; } - - -//_________________________________________________________________________ - -void AliITSClusterFinderSSD::GetCrossingError(Float_t& dP, Float_t& dN) -{ -// get crossing error - - Float_t dz, dx; - - dz = TMath::Abs(( dP + dN )*fPitch/(fTanP + fTanN) ); - dx = fPitch*(TMath::Abs(dP*(1 - fTanP/(fTanP + fTanN))) + - TMath::Abs(dN *fTanP/(fTanP + fTanN) )); - - dN = dz; - dP = dx; +//______________________________________________________________________ +void AliITSClusterFinderSSD::GetCrossingError(Float_t& dP, Float_t& dN){ + // get crossing error + Float_t dz, dx; + + dz = TMath::Abs(( dP + dN )*fPitch/(fTanP + fTanN) ); + dx = fPitch*(TMath::Abs(dP*(1 - fTanP/(fTanP + fTanN))) + + TMath::Abs(dN *fTanP/(fTanP + fTanN) )); + dN = dz; + dP = dx; } - - - - - - -