+ if(nMatches > 0){
+
+ //In case of ESDs, by default without match one entry with negative index, no match, reject.
+ if(!strcmp("AliESDCaloCluster",Form("%s",cluster->ClassName())))
+ {
+ Int_t iESDtrack = cluster->GetTrackMatchedIndex();
+ if(iESDtrack >= 0) track = dynamic_cast<AliVTrack*> (event->GetTrack(iESDtrack));
+ else return kFALSE;
+
+ if (!track){
+ printf("AliCaloPID::IsTrackMatched() - Null matched track in ESD when index is OK!\n");
+ return kFALSE;
+ }
+ }
+ else { // AOD
+ track = dynamic_cast<AliVTrack*> (cluster->GetTrackMatched(0));
+ if (!track){
+ printf("AliCaloPID::IsTrackMatched() - Null matched track in AOD!\n");
+ return kFALSE;
+ }
+ }
+
+ Float_t clE = cluster->E();
+ Float_t dZ = cluster->GetTrackDz();
+ Float_t dR = cluster->GetTrackDx();
+
+ // if track matching was recalculated
+ if(cluster->IsEMCAL() &&cu && cu->IsRecalculationOfClusterTrackMatchingOn()){
+ dR = 2000., dZ = 2000.;
+ cu->GetEMCALRecoUtils()->GetMatchedResiduals(cluster->GetID(),dR,dZ);
+ }
+
+ // Fill control histograms
+ if(fhTrackMatchedDEta && TMath::Abs(dR) < 999){
+ fhTrackMatchedDEta->Fill(clE,dZ);
+ fhTrackMatchedDPhi->Fill(clE,dR);
+ if(clE > 0.5)fhTrackMatchedDEtaDPhi->Fill(dZ,dR);
+ //printf("AliCaloPID::IsTrackMatched - %d dR %f , dZ %f \n",cluster->IsEMCAL(),dR, dZ);
+ }
+
+ if(cluster->IsPHOS()) {
+
+ track->GetPxPyPz(p) ;
+ TLorentzVector trackmom(p[0],p[1],p[2],0);
+ Int_t charge = track->Charge();
+ Double_t mf = event->GetMagneticField();
+ if(TestPHOSChargedVeto(dR, dZ, trackmom.Pt(), charge, mf ) < fPHOSRCut) return kTRUE;
+ else return kFALSE;
+
+ }//PHOS
+ else {//EMCAL
+
+ if(fDebug > 0)
+ printf("AliCaloPID::IsTrackMatched - EMCAL dR %f < %f, dZ %f < %f \n",dR, fEMCALDPhiCut, dZ, fEMCALDEtaCut);
+
+ if(TMath::Abs(dR) < fEMCALDPhiCut &&
+ TMath::Abs(dZ) < fEMCALDEtaCut) return kTRUE;
+ else return kFALSE;
+
+ }//EMCAL cluster
+
+
+ } // more than 1 match, at least one track in array
+ else return kFALSE;
+
+}
+
+//___________________________________________________________________________________________________
+Float_t AliCaloPID::TestPHOSDispersion(const Double_t pt, const Double_t l1, const Double_t l2) const
+{
+ //Check if cluster photon-like. Uses photon cluster parameterization in real pp data
+ //Returns distance in sigmas. Recommended cut 2.5
+
+ Double_t l2Mean = 1.53126+9.50835e+06/(1.+1.08728e+07*pt+1.73420e+06*pt*pt) ;
+ Double_t l1Mean = 1.12365+0.123770*TMath::Exp(-pt*0.246551)+5.30000e-03*pt ;
+ Double_t l2Sigma = 6.48260e-02+7.60261e+10/(1.+1.53012e+11*pt+5.01265e+05*pt*pt)+9.00000e-03*pt;
+ Double_t l1Sigma = 4.44719e-04+6.99839e-01/(1.+1.22497e+00*pt+6.78604e-07*pt*pt)+9.00000e-03*pt;
+ Double_t c =-0.35-0.550*TMath::Exp(-0.390730*pt) ;
+ Double_t r2 = 0.5* (l1-l1Mean)*(l1-l1Mean)/l1Sigma/l1Sigma +
+ 0.5* (l2-l2Mean)*(l2-l2Mean)/l2Sigma/l2Sigma +
+ 0.5*c*(l1-l1Mean)*(l2-l2Mean)/l1Sigma/l2Sigma ;
+
+ if(fDebug > 0) printf("AliCaloPID::TestPHOSDispersion() - PHOS SS R %f < %f?\n", TMath::Sqrt(r2), fPHOSDispersionCut);
+
+ return TMath::Sqrt(r2) ;
+
+}
+
+//_______________________________________________________________________________________________
+Float_t AliCaloPID::TestPHOSChargedVeto(const Double_t dx, const Double_t dz, const Double_t pt,
+ const Int_t charge, const Double_t mf) const
+{
+ //Checks distance to the closest track. Takes into account
+ //non-perpendicular incidence of tracks.
+ //returns distance in sigmas. Recommended cut: 2.
+ //Requires (sign) of magnetic filed. onc can find it for example as following
+ // Double_t mf=0. ;
+ // AliESDEvent *event = dynamic_cast<AliESDEvent*>(InputEvent());
+ // if(event)
+ // mf = event->GetMagneticField(); //Positive for ++ and negative for --
+
+
+ Double_t meanX = 0.;
+ Double_t meanZ = 0.;
+ Double_t sx = TMath::Min(5.4,2.59719e+02*TMath::Exp(-pt/1.02053e-01)+
+ 6.58365e-01*5.91917e-01*5.91917e-01/((pt-9.61306e-01)*(pt-9.61306e-01)+5.91917e-01*5.91917e-01)+
+ 1.59219);
+ Double_t sz = TMath::Min(2.75,4.90341e+02*1.91456e-02*1.91456e-02/(pt*pt+1.91456e-02*1.91456e-02)+
+ 1.60) ;
+
+ if(mf<0.){ //field --
+ meanZ = -0.468318 ;
+ if(charge>0)
+ meanX = TMath::Min(7.3, 3.89994*1.20679 *1.20679 /(pt*pt+1.20679*1.20679)+
+ 0.249029+2.49088e+07*TMath::Exp(-pt*3.33650e+01)) ;
+ else
+ meanX =-TMath::Min(7.7, 3.86040*0.912499*0.912499/(pt*pt+0.912499*0.912499)+
+ 1.23114 +4.48277e+05*TMath::Exp(-pt*2.57070e+01)) ;
+ }
+ else{ //Field ++
+ meanZ = -0.468318;
+ if(charge>0)
+ meanX =-TMath::Min(8.0,3.86040*1.31357*1.31357/(pt*pt+1.31357*1.31357)+
+ 0.880579+7.56199e+06*TMath::Exp(-pt*3.08451e+01)) ;
+ else
+ meanX = TMath::Min(6.85, 3.89994*1.16240*1.16240/(pt*pt+1.16240*1.16240)-
+ 0.120787+2.20275e+05*TMath::Exp(-pt*2.40913e+01)) ;
+ }
+
+ Double_t rz = (dz-meanZ)/sz ;
+ Double_t rx = (dx-meanX)/sx ;
+
+ if(fDebug > 0)
+ printf("AliCaloPID::TestPHOSDispersion() - PHOS Matching R %f < %f\n",TMath::Sqrt(rx*rx+rz*rz), fPHOSRCut);
+
+ return TMath::Sqrt(rx*rx+rz*rz) ;
+
+}