#include "AliJBaseTrack.h"
#include "AliJPhoton.h"
#include <TF1.h>
ClassImp(AliJPhoton);
AliJPhoton::AliJPhoton() :
AliJBaseTrack(),
fChi2(-999),
fTof(-999),
fX(-999),
fY(-999),
fZ(-999),
fProbPhot(-999),
fTrackDx(-1),
fTrackDz(-1),
fCaloType(kUndef),
fDistToBadChannel(-999),
fDispersion(-999),
fM20(-999),
fM02(-999),
fEmcCpvDist(-999),
fNCells(-999),
fNTracksMatched(-999),
fSuperModuleId(-999),
fCellsAbsId(0x0),
fCellsAmpFraction(0x0),
fNEMCLabel(0),
fEMCLabel(0x0),
fEMax(-999),
fECross(-999),
fECore(-999),
fNLM(-999),
fCellsIndex(0x0)
{
for(Int_t i=0;i<kUnknownAli+1;i++) fCaloPID[i]=-1;
SetPID((Double_t*)NULL);
}
AliJPhoton::AliJPhoton(const AliJPhoton& a) :
AliJBaseTrack(a),
fChi2(a.fChi2),
fTof(a.fTof),
fX(a.fX),
fY(a.fY),
fZ(a.fZ),
fProbPhot(a.fProbPhot),
fTrackDx(a.fTrackDx),
fTrackDz(a.fTrackDz),
fCaloType(a.fCaloType),
fDistToBadChannel(a.fDistToBadChannel),
fDispersion(a.fDispersion),
fM20(a.fM20),
fM02(a.fM02),
fEmcCpvDist(a.fEmcCpvDist),
fNCells(a.fNCells),
fNTracksMatched(a.fNTracksMatched),
fSuperModuleId(a.fSuperModuleId),
fCellsAbsId(NULL),
fCellsAmpFraction(NULL),
fNEMCLabel(a.fNEMCLabel),
fEMCLabel(NULL),
fEMax(a.fEMax),
fECross(a.fECross),
fECore(a.fECore),
fNLM(a.fNLM),
fCellsIndex(NULL)
{
for(Int_t i=0;i<kUnknownAli+1;i++) fCaloPID[i] = a.fCaloPID[i];
SetCellsAbsId( a.fCellsAbsId );
SetCellsAmplitudeFraction( a.fCellsAmpFraction );
SetCellsIndex( a.fCellsIndex );
SetEMCLabel( a.fEMCLabel );
}
AliJPhoton::~AliJPhoton(){
Clear("");
}
void AliJPhoton::Clear( Option_t * ){
if(fCellsAbsId) delete [] fCellsAbsId;
if(fCellsAmpFraction) delete [] fCellsAmpFraction;
if( fEMCLabel ) delete [] fEMCLabel;
if( fCellsIndex ) delete [] fCellsIndex;
fCellsAbsId = 0;
fCellsAmpFraction = 0;
fEMCLabel = 0;
fCellsIndex = 0;
}
AliJPhoton& AliJPhoton::operator=(const AliJPhoton& photon){
if(this != &photon){
AliJBaseTrack::operator=(photon);
fChi2 = photon.fChi2;
fTof = photon.fTof;
fX = photon.fX;
fY = photon.fY;
fZ = photon.fZ;
fProbPhot = photon.fProbPhot;
fTrackDx = photon.fTrackDx;
fTrackDz = photon.fTrackDz;
fCaloType = photon.fCaloType;
for(Int_t i=0; i<kUnknownAli+1; i++){
fCaloPID[i] = photon.fCaloPID[i];
}
fDistToBadChannel = photon.fDistToBadChannel;
fDispersion = photon.fDispersion;
fM20 = photon.fM20;
fM02 = photon.fM02;
fEmcCpvDist = photon.fEmcCpvDist;
fNCells = photon.fNCells;
fNTracksMatched = photon.fNTracksMatched;
fSuperModuleId = photon.fSuperModuleId;
SetCellsAbsId( photon.fCellsAbsId );
SetCellsAmplitudeFraction( photon.fCellsAmpFraction );
SetEMCLabel( photon.fEMCLabel );
fEMax = photon.fEMax;
fECross = photon.fECross;
fECore = photon.fECore;
fNLM = photon.fNLM;
SetCellsIndex( photon.fCellsIndex );
}
return *this;
}
void AliJPhoton::SetCellsAbsId(const UShort_t *array)
{
if (fNCells) {
if(fCellsAbsId){ delete [] fCellsAbsId; fCellsAbsId = NULL; }
fCellsAbsId = new UShort_t[fNCells];
for (Int_t i = 0; i < fNCells; i++) fCellsAbsId[i] = array[i];
}
}
void AliJPhoton::SetCellsAmplitudeFraction(const Double32_t *array)
{
if (fNCells) {
if(fCellsAmpFraction){ delete [] fCellsAmpFraction; fCellsAmpFraction = NULL;}
fCellsAmpFraction = new Double32_t[fNCells];
for (Int_t i = 0; i < fNCells; i++) fCellsAmpFraction[i] = array[i];
}
}
void AliJPhoton::SetEMCLabel(const Int_t *array)
{
if (fNEMCLabel) {
if(fEMCLabel){ delete [] fEMCLabel; fEMCLabel = NULL; }
fEMCLabel = new Int_t[fNEMCLabel];
for (Int_t i = 0; i < fNEMCLabel; i++) fEMCLabel[i] = array[i];
}
}
void AliJPhoton::SetCellsIndex(const Int_t *array)
{
if( !array ){
if( fCellsIndex ){
delete [] fCellsIndex;
fCellsIndex = NULL;
}
}
else if (fNCells) {
if( fCellsIndex ){
delete [] fCellsIndex;
fCellsIndex = NULL;
}
fCellsIndex = new Int_t[fNCells];
for (Int_t i = 0; i < fNCells; i++)
fCellsIndex[i] = array[i];
}
}
void AliJPhoton::SetCellIndex(const Int_t pos, const Int_t ind)
{
Int_t i;
if (fNCells) {
if( ! fCellsIndex ){
fCellsIndex = new Int_t[fNCells];
for( i = 0; i < fNCells; i++ )
fCellsIndex[i] = -1;
}
}
fCellsIndex[pos] = ind;
}
void AliJPhoton::ClearCellsIndex()
{
if(fCellsIndex){
delete [] fCellsIndex;
fCellsIndex = NULL;
}
}
void AliJPhoton::SetPID(const Double32_t *pid) {
if(pid){
for(Int_t i=0; i<kUnknownAli; ++i) fCaloPID[i]=pid[i];
SetProbPhot(fCaloPID[kPhotonAli]);
}else{
for(Int_t i=0; i<kUnknownAli; fCaloPID[i++]=0.){}
fCaloPID[kUnknownAli]=1.;
}
}
particleType AliJPhoton::GetParticleType() {
Float_t wPhoton = 0.75 ;
Float_t wPi0 = 0.8 ;
Float_t wElectron = 0.5 ;
Float_t wCharged = 0.5 ;
Float_t wNeutral = 0.5 ;
Bool_t usePHOSweightFormula = kTRUE;
TFormula* wPhotonPHOSFormula =
new TFormula("photonWeight","0.75*(x<40)+ 0.68*(x>=100)+(x>=40 && x<100)*(0.98+x*(6e-3)-x*x*(2e-04)+x*x*x*(1.1e-06))");
TFormula* wPi0PHOSFormula =
new TFormula("pi0Weight","0.80*(x<65)+ 0.915*(x>=100)+(x>=65 && x-x*(1.95e-3)-x*x*(4.31e-05)+x*x*x*(3.61e-07))");
if(fCaloType == kPHOSCalo && usePHOSweightFormula){
wPhoton = wPhotonPHOSFormula->Eval(E()) ;
wPi0 = wPi0PHOSFormula->Eval(E());
}
if(fCaloType == kEMCALCalo){
wPhoton = 0.8 ;
wPi0 = 0.5 ;
wElectron = 0.8 ;
wCharged = 0.5 ;
wNeutral = 0.5 ;
}
particleType pdg = kJHadron;
if(fCaloType == kPHOSCalo){
if(fCaloPID[kPhotonAli] > wPhoton) pdg = kJPhoton ;
else if(fCaloPID[kPi0Ali] > wPi0) pdg = kJPizero ;
}
else{
if(fCaloPID[kPhotonAli] + fCaloPID[kElectronAli] > wPhoton) pdg = kJPhoton ;
else if(fCaloPID[kPi0Ali] > wPi0) pdg = kJPizero ;
}
delete wPhotonPHOSFormula;
delete wPi0PHOSFormula;
return pdg ;
}