X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=HMPID%2FAliHMPIDRecon.cxx;h=b3aa7c550f1ffd6da3a84958950f249733fc3182;hb=e5c6555168e1479068ffa870b72387109780d5cf;hp=0e832ebba7efb30e7bef5bbaf514f9e3941aeaed;hpb=97a4d5386a1e8114730e7a1af54cd9f135ee8ccd;p=u%2Fmrichter%2FAliRoot.git diff --git a/HMPID/AliHMPIDRecon.cxx b/HMPID/AliHMPIDRecon.cxx index 0e832ebba7e..b3aa7c550f1 100644 --- a/HMPID/AliHMPIDRecon.cxx +++ b/HMPID/AliHMPIDRecon.cxx @@ -27,12 +27,14 @@ #include //HoughResponse() #include //CkovAngle() #include //CkovAngle() +#include //CkovAngle() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AliHMPIDRecon::AliHMPIDRecon(): TTask("RichRec","RichPat"), fPhotCnt(-1), fPhotFlag(0x0), + fPhotClusIndex(0x0), fPhotCkov(0x0), fPhotPhi(0x0), fPhotWei(0x0), @@ -62,6 +64,7 @@ void AliHMPIDRecon::InitVars(Int_t n) //.. if(n<=0) return; fPhotFlag = new Int_t[n]; + fPhotClusIndex = new Int_t[n]; fPhotCkov = new Double_t[n]; fPhotPhi = new Double_t[n]; fPhotWei = new Double_t[n]; @@ -74,6 +77,7 @@ void AliHMPIDRecon::DeleteVars()const //Delete variables //.. delete [] fPhotFlag; + delete [] fPhotClusIndex; delete [] fPhotCkov; delete [] fPhotPhi; delete [] fPhotWei; @@ -85,8 +89,7 @@ void AliHMPIDRecon::CkovAngle(AliESDtrack *pTrk,TClonesArray *pCluLst,Int_t inde // Arguments: pTrk - track for which Ckov angle is to be found // pCluLst - list of clusters for this chamber // Returns: - track ckov angle, [rad], - - + const Int_t nMinPhotAcc = 3; // Minimum number of photons required to perform the pattern recognition Int_t nClusTot = pCluLst->GetEntries(); @@ -119,7 +122,8 @@ void AliHMPIDRecon::CkovAngle(AliESDtrack *pTrk,TClonesArray *pCluLst,Int_t inde Double_t thetaCer,phiCer; if(FindPhotCkov(pClu->X(),pClu->Y(),thetaCer,phiCer)){ //find ckov angle for this photon candidate fPhotCkov[fPhotCnt]=thetaCer; //actual theta Cerenkov (in TRS) - fPhotPhi [fPhotCnt]=phiCer; //actual phi Cerenkov (in TRS): -pi to come back to "unusual" ref system (X,Y,-Z) + fPhotPhi [fPhotCnt]=phiCer; + fPhotClusIndex[fPhotCnt]=iClu; //actual phi Cerenkov (in TRS): -pi to come back to "unusual" ref system (X,Y,-Z) fPhotCnt++; //increment counter of photon candidates } }//clusters loop @@ -131,25 +135,25 @@ void AliHMPIDRecon::CkovAngle(AliESDtrack *pTrk,TClonesArray *pCluLst,Int_t inde pTrk->SetHMPIDsignal(kNoPhotAccept); //set the appropriate flag return; } - - + fMipPos.Set(mipX,mipY); - - + //PATTERN RECOGNITION STARTED: - Int_t iNrec=FlagPhot(HoughResponse()); //flag photons according to individual theta ckov with respect to most probable + Int_t iNrec=FlagPhot(HoughResponse(),pCluLst,pTrk); //flag photons according to individual theta ckov with respect to most probable + pTrk->SetHMPIDmip(mipX,mipY,mipQ,iNrec); //store mip info if(iNrec<1){ pTrk->SetHMPIDsignal(kNoPhotAccept); //no photon candidates are accepted return; } + Double_t thetaC = FindRingCkov(pCluLst->GetEntries()); //find the best reconstructed theta Cherenkov // FindRingGeom(thetaC,2); pTrk->SetHMPIDsignal(thetaC); //store theta Cherenkov pTrk->SetHMPIDchi2(fCkovSigma2); //store errors squared - + DeleteVars(); }//CkovAngle() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -353,7 +357,7 @@ Double_t AliHMPIDRecon::FindRingCkov(Int_t) return weightThetaCerenkov; }//FindCkovRing() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Int_t AliHMPIDRecon::FlagPhot(Double_t ckov) +Int_t AliHMPIDRecon::FlagPhot(Double_t ckov,TClonesArray *pCluLst, AliESDtrack *pTrk) { // Flag photon candidates if their individual ckov angle is inside the window around ckov angle returned by HoughResponse() // Arguments: ckov- value of most probable ckov angle for track as returned by HoughResponse() @@ -362,6 +366,7 @@ Int_t AliHMPIDRecon::FlagPhot(Double_t ckov) // Photon Flag: Flag = 0 initial set; // Flag = 1 good candidate (charge compatible with photon); // Flag = 2 photon used for the ring; + Int_t *PhotIndex = new Int_t[fPhotCnt]; Int_t steps = (Int_t)((ckov )/ fDTheta); //how many times we need to have fDTheta to fill the distance between 0 and thetaCkovHough @@ -376,10 +381,25 @@ Int_t AliHMPIDRecon::FlagPhot(Double_t ckov) fPhotFlag[i] = 0; if(fPhotCkov[i] >= tmin && fPhotCkov[i] <= tmax) { fPhotFlag[i]=2; + PhotIndex[iInsideCnt]=fPhotClusIndex[i]; iInsideCnt++; } } + + for (Int_t iClu=0; iCluGetEntriesFast();iClu++){//clusters loop + AliHMPIDCluster *pClu=(AliHMPIDCluster*)pCluLst->UncheckedAt(iClu); //get pointer to current cluster + for(Int_t j=0; jAddCalibObject(pClus); + } + } + } + + delete [] PhotIndex; + return iInsideCnt; + }//FlagPhot() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TVector2 AliHMPIDRecon::TracePhot(Double_t ckovThe,Double_t ckovPhi)const @@ -474,3 +494,31 @@ Double_t AliHMPIDRecon::HoughResponse() return (Double_t)(locMax*fDTheta+0.5*fDTheta); //final most probable track theta ckov }//HoughResponse() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Double_t AliHMPIDRecon::FindRingExt(Double_t ckov,Int_t ch,Double_t xPc,Double_t yPc,Double_t thRa,Double_t phRa) +{ +// To find the acceptance of the ring even from external inputs. +// +// + Double_t xRa = xPc - (fParam->RadThick()+fParam->WinThick()+fParam->GapThick())*TMath::Cos(phRa)*TMath::Tan(thRa); //just linear extrapolation back to RAD + Double_t yRa = yPc - (fParam->RadThick()+fParam->WinThick()+fParam->GapThick())*TMath::Sin(phRa)*TMath::Tan(thRa); + + Int_t nStep = 500; + Int_t nPhi = 0; + + Int_t ipc,ipadx,ipady; + + if(ckov>0){ + SetTrack(xRa,yRa,thRa,phRa); + for(Int_t j=0;jIsInDead(pos.X(),pos.Y())) continue; + fParam->Lors2Pad(pos.X(),pos.Y(),ipc,ipadx,ipady); + ipadx+=(ipc%2)*fParam->kPadPcX; + ipady+=(ipc/2)*fParam->kPadPcY; + if(fParam->IsDeadPad(ipadx,ipady,ch)) continue; + nPhi++; + }//point loop + return ((Double_t)nPhi/(Double_t)nStep); + }//if + return -1; +}