#include <TNamed.h>
#include <TGeoMatrix.h>
#include <TGeoGlobalMagField.h>
#include "AliESDRun.h"
#include "AliESDVertex.h"
#include "AliLog.h"
#include "AliMagF.h"
ClassImp(AliESDRun)
AliESDRun::AliESDRun() :
TObject(),
fCurrentL3(0),
fCurrentDip(0),
fBeamEnergy(0),
fMagneticField(0),
fDiamondZ(0),
fDiamondSig2Z(0),
fPeriodNumber(0),
fRunNumber(0),
fRecoVersion(0),
fBeamType(""),
fTriggerClasses(kNTriggerClasses),
fDetInDAQ(0),
fDetInReco(0)
{
for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
fBeamParticle[0] = fBeamParticle[1] = 0;
fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
fDiamondCovXY[1]=0.;
fTriggerClasses.SetOwner(kTRUE);
fMeanBeamInt[0][0]=fMeanBeamInt[0][1]=fMeanBeamInt[1][0]=fMeanBeamInt[1][1]=-1;
for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
for (Int_t i=0; i<kT0spreadSize;i++) fT0spread[i]=0.;
for (Int_t it=0; it<8; it++) fCaloTriggerType[it]=0;
for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
}
AliESDRun::AliESDRun(const AliESDRun &esd) :
TObject(esd),
fCurrentL3(0),
fCurrentDip(0),
fBeamEnergy(0),
fMagneticField(esd.fMagneticField),
fDiamondZ(esd.fDiamondZ),
fDiamondSig2Z(esd.fDiamondSig2Z),
fPeriodNumber(esd.fPeriodNumber),
fRunNumber(esd.fRunNumber),
fRecoVersion(esd.fRecoVersion),
fBeamType(""),
fTriggerClasses(TObjArray(kNTriggerClasses)),
fDetInDAQ(0),
fDetInReco(0)
{
for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
for (Int_t i=0; i<2; i++) fBeamParticle[i] = esd.fBeamParticle[i];
for(Int_t i = 0; i < kNTriggerClasses; i++) {
TNamed *str = (TNamed *)((esd.fTriggerClasses).At(i));
if (str) fTriggerClasses.AddAt(new TNamed(*str),i);
}
for(Int_t m=0; m<kNPHOSMatrix; m++){
if(esd.fPHOSMatrix[m])
fPHOSMatrix[m]=new TGeoHMatrix(*(esd.fPHOSMatrix[m])) ;
else
fPHOSMatrix[m]=NULL;
}
for (int ib=2;ib--;) for (int it=2;it--;) fMeanBeamInt[ib][it] = esd.fMeanBeamInt[ib][it];
for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
if(esd.fEMCALMatrix[sm])
fEMCALMatrix[sm]=new TGeoHMatrix(*(esd.fEMCALMatrix[sm])) ;
else
fEMCALMatrix[sm]=NULL;
}
for (Int_t i=0; i<kT0spreadSize;i++) fT0spread[i]=esd.fT0spread[i];
for (Int_t it=0; it<8; it++) fCaloTriggerType[it]=esd.fCaloTriggerType[it];
for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=esd.fVZEROEqFactors[j];
}
AliESDRun& AliESDRun::operator=(const AliESDRun &esd)
{
if(this!=&esd) {
TObject::operator=(esd);
fRunNumber=esd.fRunNumber;
fPeriodNumber=esd.fPeriodNumber;
fRecoVersion=esd.fRecoVersion;
fMagneticField=esd.fMagneticField;
fDiamondZ=esd.fDiamondZ;
fDiamondSig2Z=esd.fDiamondSig2Z;
fBeamType = esd.fBeamType;
fCurrentL3 = esd.fCurrentL3;
fCurrentDip = esd.fCurrentDip;
fBeamEnergy = esd.fBeamEnergy;
for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
for (Int_t i=0; i<2; i++) fBeamParticle[i] = esd.fBeamParticle[i];
fTriggerClasses.Clear();
for(Int_t i = 0; i < kNTriggerClasses; i++) {
TNamed *str = (TNamed *)((esd.fTriggerClasses).At(i));
if (str) fTriggerClasses.AddAt(new TNamed(*str),i);
}
fDetInDAQ = esd.fDetInDAQ;
fDetInReco = esd.fDetInReco;
for (int ib=2;ib--;) for (int it=2;it--;) fMeanBeamInt[ib][it] = esd.fMeanBeamInt[ib][it];
for(Int_t m=0; m<kNPHOSMatrix; m++){
delete fPHOSMatrix[m];
if(esd.fPHOSMatrix[m])
fPHOSMatrix[m]=new TGeoHMatrix(*(esd.fPHOSMatrix[m])) ;
else
fPHOSMatrix[m]=0;
}
for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
delete fEMCALMatrix[sm];
if(esd.fEMCALMatrix[sm])
fEMCALMatrix[sm]=new TGeoHMatrix(*(esd.fEMCALMatrix[sm])) ;
else
fEMCALMatrix[sm]=0;
}
}
for (Int_t i=0; i<kT0spreadSize;i++) fT0spread[i]=esd.fT0spread[i];
for (Int_t it=0; it<8; it++) fCaloTriggerType[it]=esd.fCaloTriggerType[it];
for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=esd.fVZEROEqFactors[j];
return *this;
}
void AliESDRun::Copy(TObject &obj) const{
if(this==&obj)return;
AliESDRun *robj = dynamic_cast<AliESDRun*>(&obj);
if(!robj)return;
*robj = *this;
}
AliESDRun::~AliESDRun() {
for(Int_t m=0; m<kNPHOSMatrix; m++) {
if(fPHOSMatrix[m]) delete fPHOSMatrix[m] ;
fPHOSMatrix[m] = NULL;
}
for(Int_t sm=0; sm<kNEMCALMatrix; sm++) {
if(fEMCALMatrix[sm]) delete fEMCALMatrix[sm] ;
fEMCALMatrix[sm] = NULL;
}
}
void AliESDRun::SetDiamond(const AliESDVertex *vertex) {
if (vertex) {
fDiamondXY[0]=vertex->GetX();
fDiamondXY[1]=vertex->GetY();
fDiamondZ=vertex->GetZ();
Double32_t cov[6];
vertex->GetCovMatrix(cov);
fDiamondCovXY[0]=cov[0];
fDiamondCovXY[1]=cov[1];
fDiamondCovXY[2]=cov[2];
fDiamondSig2Z=cov[5];
}
}
void AliESDRun::Print(const Option_t *) const
{
printf("Mean vertex in RUN %d: X=%.4f Y=%.4f Z=%.4f cm\n",
GetRunNumber(),GetDiamondX(),GetDiamondY(),GetDiamondZ());
printf("Beam Type: %s (%d/%d - %d/%d), Energy: %.1f GeV\n",fBeamType.IsNull() ? "N/A":GetBeamType(),
GetBeamParticleA(0),GetBeamParticleZ(0),GetBeamParticleA(1),GetBeamParticleZ(1),
fBeamEnergy);
printf("Magnetic field in IP= %f T | Currents: L3:%+.1f Dipole:%+.1f %s\n",
GetMagneticField(),fCurrentL3,fCurrentDip,TestBit(kUniformBMap) ? "(Uniform)":"");
printf("Event from reconstruction version %d \n",fRecoVersion);
printf("List of active trigger classes: ");
for(Int_t i = 0; i < kNTriggerClasses; i++) {
TNamed *str = (TNamed *)((fTriggerClasses).At(i));
if (str) printf("%s ",str->GetName());
}
printf("Mean intenstity for interacting : beam1:%+.3e beam2:%+.3e\n",fMeanBeamInt[0][0],fMeanBeamInt[1][0]);
printf("Mean intenstity for non-intecting : beam1:%+.3e beam2:%+.3e\n",fMeanBeamInt[0][1],fMeanBeamInt[1][1]);
printf("\n");
}
void AliESDRun::Reset()
{
fRunNumber = 0;
fPeriodNumber = 0;
fRecoVersion = 0;
fMagneticField = 0;
fCurrentL3 = 0;
fCurrentDip = 0;
fBeamEnergy = 0;
fBeamType = "";
ResetBit(kBInfoStored|kUniformBMap|kConvSqrtSHalfGeV);
for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
fDiamondCovXY[1]=0.;
fDiamondZ=0.;
fDiamondSig2Z=10.*10.;
fTriggerClasses.Clear();
fDetInDAQ = 0;
fDetInReco = 0;
}
void AliESDRun::SetTriggerClass(const char* name, Int_t index)
{
if (index >= kNTriggerClasses || index < 0) {
AliError(Form("Index (%d) is outside the allowed range (0,49)!",index));
return;
}
fTriggerClasses.AddAt(new TNamed(name,NULL),index);
}
const char* AliESDRun::GetTriggerClass(Int_t index) const
{
TNamed *trclass = (TNamed *)fTriggerClasses.At(index);
if (trclass)
return trclass->GetName();
else
return "";
}
TString AliESDRun::GetActiveTriggerClasses() const
{
TString trclasses;
for(Int_t i = 0; i < kNTriggerClasses; i++) {
TNamed *str = (TNamed *)((fTriggerClasses).At(i));
if (str) {
trclasses += " ";
trclasses += str->GetName();
trclasses += " ";
}
}
return trclasses;
}
TString AliESDRun::GetFiredTriggerClasses(ULong64_t mask) const
{
TString trclasses;
for(Int_t i = 0; i < kNTriggerClasses/2; i++) {
if (mask & (1ull << i)) {
TNamed *str = (TNamed *)((fTriggerClasses).At(i));
if (str) {
trclasses += " ";
trclasses += str->GetName();
trclasses += " ";
}
}
}
return trclasses;
}
TString AliESDRun::GetFiredTriggerClassesNext50(ULong64_t mask) const
{
TString trclasses;
for(Int_t i = 0; i < kNTriggerClasses/2; i++) {
if (mask & (1ull << i)) {
TNamed *str = (TNamed *)((fTriggerClasses).At(i+50));
if (str) {
trclasses += " ";
trclasses += str->GetName();
trclasses += " ";
}
}
}
return trclasses;
}
TString AliESDRun::GetFiredTriggerClasses(ULong64_t masklow,ULong64_t maskhigh) const
{
TString trclasseslow;
trclasseslow = GetFiredTriggerClasses(masklow);
TString trclasseshigh;
trclasseshigh = GetFiredTriggerClassesNext50(maskhigh);
TString trclasses;
trclasses = trclasseslow+trclasseshigh;
return trclasses;
}
void AliESDRun::PrintAllTriggerClasses() const
{
TString trclasses;
for(Int_t i = 0; i < kNTriggerClasses; i++) {
TNamed *str = (TNamed *)((fTriggerClasses).At(i));
if (str) {
printf("%03i:",i+1);
printf("%s ",str->GetName());
}else{
}
}
printf("\n");
}
Bool_t AliESDRun::IsTriggerClassFired(ULong64_t mask, const char *name) const
{
TNamed *trclass = (TNamed *)fTriggerClasses.FindObject(name);
if (!trclass) return kFALSE;
Int_t iclass = fTriggerClasses.IndexOf(trclass);
if (iclass < 0) return kFALSE;
if (mask & (1ull << iclass))
return kTRUE;
else
return kFALSE;
}
Bool_t AliESDRun::IsTriggerClassFired(ULong64_t masklow, ULong64_t maskhigh,const char *name) const
{
return (IsTriggerClassFired(masklow,name) || IsTriggerClassFired(maskhigh,name));
}
Bool_t AliESDRun::InitMagneticField() const
{
if (!TestBit(kBInfoStored)) {
AliError("No information on currents, cannot create field from run header");
return kFALSE;
}
AliMagF* fld = (AliMagF*) TGeoGlobalMagField::Instance()->GetField();
if (fld) {
if (TGeoGlobalMagField::Instance()->IsLocked()) {
if (fld->TestBit(AliMagF::kOverrideGRP)) {
AliInfo("ExpertMode!!! Information on magnet currents will be ignored !");
AliInfo("ExpertMode!!! Running with the externally locked B field !");
return kTRUE;
}
}
AliInfo("Destroying existing B field instance!");
delete TGeoGlobalMagField::Instance();
}
fld = AliMagF::CreateFieldMap(fCurrentL3,fCurrentDip,AliMagF::kConvLHC,
TestBit(kUniformBMap), GetBeamEnergy(), GetBeamType());
if (fld) {
TGeoGlobalMagField::Instance()->SetField( fld );
TGeoGlobalMagField::Instance()->Lock();
AliInfo("Running with the B field constructed out of the Run Header !");
return kTRUE;
}
else {
AliError("Failed to create a B field map !");
return kFALSE;
}
}
void AliESDRun::SetT0spread(Int_t i,Float_t t)
{
if ( (i>=0) && (i<kT0spreadSize)) {
fT0spread[i]=t;
} else {
AliError(Form("Index %d out of bound",i));
}
return;
}
void AliESDRun::SetT0spread(Float_t *t)
{
if (t == 0x0){
AliError(Form("Null pointer passed"));
}
else{
for (Int_t i=0;i<kT0spreadSize;i++) fT0spread[i]=t[i];
}
return;
}