- AliHMPIDReconHTA reconHTA; //instance of reconstruction class, nothing important in ctor
- Double_t nmean=((TF1*)pNmean->At(3*iCh))->Eval(0); //C6F14 Nmean for this chamber
- Double_t qthre = 0;
- if(pQthre->GetEntriesFast()==AliHMPIDParam::kMaxCh+1) //
- qthre=((TF1*)pQthre->At(iCh))->Eval(0); //just for backward compatibi
- else qthre=((TF1*)pQthre->At(6*iCh+iHVsec))->Eval(0); //
- if(pCluLst->GetEntriesFast()<4) return 1; //min 4 clusters (3 + 1 mip) to find a ring!
- if(reconHTA.CkovHiddenTrk(pTrk,pCluLst,nmean,qthre)) return 0; //search for track parameters and Cerenkov angle of this track
- else return 1; // error code: 0=no error,1=fit not performed;
+
+ AliHMPIDReconHTA reconHTA; //instance of reconstruction class, nothing important in ctor
+
+ AliHMPIDParam *pParam = AliHMPIDParam::Instance(); //Instance of AliHMPIDParam
+
+ Bool_t tsRight = kTRUE;
+
+ UInt_t tsmin = (UInt_t)((TF1*)pQthre->At(0))->GetXmin(); //
+ UInt_t tsmax = (UInt_t)((TF1*)pQthre->At(0))->GetXmax(); //
+ UInt_t ts = pEsd->GetTimeStamp();
+
+ if(ts<tsmin || ts>tsmax) {
+ AliWarning(Form(" in HMPID time stamp out of range!!! Please check!!! ts = %i",ts));
+ tsRight = kFALSE;
+ }
+
+ for(Int_t iTrk=0;iTrk<pEsd->GetNumberOfTracks();iTrk++){ //loop on the ESD tracks in the event
+
+ AliESDtrack *pTrk = pEsd->GetTrack(iTrk); //here it is simulated or just empty track
+ Int_t ipCh;
+ ipCh = pTrk->GetHMPIDcluIdx();ipCh/=1000000;
+ if(ipCh<0) continue;
+
+ TClonesArray *pMipCluLst=(TClonesArray *)pClus->At(ipCh); //get the list of clusters
+ Int_t nMipClusTot = pMipCluLst->GetEntries(); //total number of clusters in the given chamber
+
+ Double_t qMip=-1;
+ Int_t chMip=-1;
+ Double_t xMip = 0;
+ Double_t yMip = 0;
+ Int_t indMip = 0;
+ Int_t cluMipSiz = 0;
+
+ for (Int_t iClu=0; iClu<nMipClusTot;iClu++) { //clusters loop
+
+ AliHMPIDCluster *pClu=(AliHMPIDCluster*)pMipCluLst->UncheckedAt(iClu); //get the cluster
+ Double_t qClus = pClu->Q();
+ if(qClus>qMip) {
+ qMip = qClus;
+ chMip = pClu->Ch();
+ xMip = pClu->X();
+ yMip = pClu->Y();
+ indMip = iClu;
+ cluMipSiz = pClu->Size();
+ }
+ }//clus loop
+
+ if(chMip<0) return 1;
+
+ Int_t hvsec;
+ Double_t qthre=0;
+
+// evaluate qThre
+ if(tsRight){
+ if(pQthre->GetEntriesFast()==pParam->kMaxCh+1) { // just for backward compatibility
+ qthre=((TF1*)pQthre->At(chMip))->Eval(ts); //
+ } else { // in the past just 1 qthre
+ hvsec = pParam->InHVSector(yMip); // per chamber
+ if(hvsec>=0) qthre=((TF1*)pQthre->At(6*chMip+hvsec))->Eval(ts); //
+ }
+ } else qthre = pParam->QCut();
+//
+ if(qMip<qthre) {
+ pTrk->SetHMPIDmip(xMip,yMip,(Int_t)qMip,0); //store mip info in any case
+ pTrk->SetHMPIDcluIdx(chMip,indMip+1000*cluMipSiz);
+ pTrk->SetHMPIDsignal(pParam->kMipQdcCut);
+ return 1; //charge compatible with MIP clusters
+ }
+
+ pTrk->SetHMPIDmip(xMip,yMip,(Int_t)qMip,0); //store mip info in any case
+ pTrk->SetHMPIDcluIdx(chMip,indMip+1000*cluMipSiz);
+
+ Double_t yRa = yMip; //just an approx...
+ Double_t nmean;
+
+ Int_t iRad = pParam->Radiator(yRa); //evaluate the radiator involved
+
+ //evaluate nMean
+ if(tsRight){
+ if(pNmean->GetEntries()==21) { //for backward compatibility
+ nmean=((TF1*)pNmean->At(3*chMip))->Eval(ts); //C6F14 Nmean for this chamber
+ } else {
+ if(iRad < 0) {
+ nmean = -1;
+ } else {
+ Double_t tLow = ((TF1*)pNmean->At(6*chMip+2*iRad ))->Eval(ts); //C6F14 low temp for this chamber
+ Double_t tHigh = ((TF1*)pNmean->At(6*chMip+2*iRad+1))->Eval(ts); //C6F14 high temp for this chamber
+ Double_t tExp = pParam->FindTemp(tLow,tHigh,yRa); //estimated temp for that chamber at that y
+ nmean = pParam->NIdxRad(AliHMPIDParam::Instance()->GetEPhotMean(),tExp); //mean ref idx @ a given temp
+ }
+ if(nmean < 0){ //track didn' t pass through the radiator
+ pTrk->SetHMPIDsignal(AliHMPIDRecon::kNoRad); //set the appropriate flag
+ return 1;
+ }
+ }
+ } else nmean = pParam->MeanIdxRad();
+ //
+ if(!reconHTA.CkovHiddenTrk(pTrk,(TClonesArray *)pClus->At(ipCh),indMip,nmean)) { //search for track parameters and Cerenkov angle of this track
+ AliHMPIDPid pID;
+ Double_t prob[5];
+ pID.FindPid(pTrk,5,prob);
+ pTrk->SetHMPIDpid(prob);
+ }
+// Printf(" Prob e- %6.2f mu %6.2f pi %6.2f k %6.2f p %6.2f",prob[0]*100,prob[1]*100,prob[2]*100,prob[3]*100,prob[4]*100);
+ }//iTrk
+
+ return 0; // error code: 0=no error;
+