#include "TChain.h"
#include "TFile.h"
#include "TROOT.h"
#include "TClonesArray.h"
#include "TH2.h"
#include "TGeoManager.h"
#include "TGeoGlobalMagField.h"
#include "AliGeomManager.h"
#include "AliGRPObject.h"
#include "AliCDBPath.h"
#include "AliCDBEntry.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliAnalysisManager.h"
#include "AliVEventHandler.h"
#include "AliInputEventHandler.h"
#include "AliMultiplicity.h"
#include "AliAODMCParticle.h"
#include "AliAODMCHeader.h"
#include "AliCDBManager.h"
#include "AliAODHandler.h"
#include "AliMagF.h"
#include "AliPHOSReconstructor.h"
#include "AliPHOSClusterizerv1.h"
#include "AliPHOSDigit.h"
#include "AliPHOSGeometry.h"
#include "AliPHOSEmbedding.h"
ClassImp(AliPHOSEmbedding)
AliPHOSEmbedding::AliPHOSEmbedding(const char *name)
: AliAnalysisTaskSE(name),
fAODChain(0x0),
fDigitsTree(0x0),
fClustersTree(0x0),
fTreeOut(0x0),
fDigitsArr(0x0),
fEmbeddedClusters(0x0),
fEmbeddedCells(0x0),
fCellsPHOS(0x0),
fClusterizer(0x0),
fPHOSReconstructor(0x0),
fNSignal(0),
fNCaloClustersOld(0),
fInitialized(0)
{
for(int i=0;i<5;i++)fOldPHOSCalibration[i]=0x0 ;
}
void AliPHOSEmbedding::UserCreateOutputObjects()
{
TClonesArray *mcparticles = new TClonesArray("AliAODMCParticle",0);
mcparticles->SetName(AliAODMCParticle::StdBranchName());
AddAODBranch("TClonesArray", &mcparticles);
fEmbeddedClusters = new TClonesArray("AliAODCaloCluster",0);
fEmbeddedClusters->SetName("EmbeddedCaloClusters");
AddAODBranch("TClonesArray", &fEmbeddedClusters);
fEmbeddedCells = new AliAODCaloCells();
fEmbeddedCells->SetName("EmbeddedPHOScells");
AddAODBranch("AliAODCaloCells", &fEmbeddedCells);
fDigitsArr = new TClonesArray("AliPHOSDigit",3*56*64) ;
AliAODHandler* handler = (AliAODHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
if (handler) {
fTreeOut = handler->GetTree();
}
else {
AliWarning("No output AOD Event Handler connected.") ;
}
}
void AliPHOSEmbedding::UserExec(Option_t *) {
AliESDEvent *event = dynamic_cast<AliESDEvent*>(InputEvent());
if (!event) {
Printf("ERROR: Could not retrieve event");
PostData(0, fTreeOut);
return;
}
AliCentrality *centrality = event->GetCentrality();
Float_t acentrality=centrality->GetCentralityPercentileUnchecked("V0M");
if( acentrality <= 0. || acentrality>80.){
return;
}
AliAODEvent * signal = GetNextSignalEvent() ;
if (!signal) {
Printf("ERROR: Could not retrieve signal");
PostData(0, fTreeOut);
return;
}
Init() ;
CopyRecalibrateDigits() ;
AliAODEvent * nullSignal=0x0 ;
MakeEmbedding(event,nullSignal) ;
ConvertESDtoAOD(event);
MakeEmbedding(event,signal) ;
ConvertEmbeddedClusters(event) ;
ConvertMCParticles(signal) ;
delete signal ;
PostData(0, fTreeOut);
}
void AliPHOSEmbedding::CopyRecalibrateDigits(){
AliESDEvent *event = dynamic_cast<AliESDEvent*>(InputEvent());
if(!event){
AliError("No ESD event!");
return ;
}
if(fCellsPHOS)
delete fCellsPHOS ;
fCellsPHOS = new AliESDCaloCells() ;
fCellsPHOS->CreateContainer(event->GetPHOSCells()->GetNumberOfCells());
for (Short_t icell = 0; icell < event->GetPHOSCells()->GetNumberOfCells(); icell++) {
Short_t id=0;
Double_t time=0., amp=0. ;
Int_t mclabel;
Double_t efrac =0. ;
if (event->GetPHOSCells()->GetCell(icell, id, amp,time,mclabel,efrac) != kTRUE)
break;
Int_t relId[4] ;
AliPHOSGeometry::GetInstance()->AbsToRelNumbering(id,relId);
Float_t calibESD=fOldPHOSCalibration[relId[0]-1]->GetBinContent(relId[2],relId[3]) ;
Float_t calibNew=fPHOSReconstructor->Calibrate(1.,id) ;
if(calibESD>0.)
amp=amp*calibNew/calibESD ;
fCellsPHOS->SetCell(icell, id, amp, time,mclabel,efrac);
}
}
void AliPHOSEmbedding::Init(){
if(fInitialized)
return ;
AliESDEvent *event = dynamic_cast<AliESDEvent*>(InputEvent());
if(!event){
AliError("Can not obtain InputEvent!") ;
return ;
}
Int_t runNum = event->GetRunNumber();
AliCDBManager::Instance()->SetRun(runNum);
fPHOSReconstructor = new AliPHOSReconstructor() ;
AliCDBPath path("PHOS","Calib","RecoParam");
AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
if(!entry){
AliError(Form("Can not get OCDB entry %s",path.GetPath().Data())) ;
return ;
}
TObjArray* recoParamArray = (TObjArray*)entry->GetObject();
AliPHOSRecoParam* recoParam = (AliPHOSRecoParam*)recoParamArray->At(2);
fPHOSReconstructor->SetRecoParam(recoParam) ;
InitMF() ;
InitGeometry() ;
fInitialized=kTRUE ;
}
AliAODEvent* AliPHOSEmbedding::GetNextSignalEvent(){
if(fAODChain==0){
AliError("No chain to read signal events") ;
return 0 ;
}
AliAODEvent* aod = new AliAODEvent;
aod->ReadFromTree(fAODChain);
if(fNSignal>=fAODChain->GetEntries()){
delete aod ;
return 0 ;
}
fAODChain->GetEvent(fNSignal) ;
fNSignal++ ;
return aod ;
}
void AliPHOSEmbedding::MakeEmbedding(AliESDEvent *event,AliAODEvent * signal){
gROOT->cd();
if(fDigitsTree){
delete fDigitsTree ;
}
fDigitsTree = new TTree("digitstree","digitstree");
fDigitsTree->Branch("PHOS","TClonesArray", &fDigitsArr, 32000);
if(fClustersTree){
delete fClustersTree ;
}
fClustersTree = new TTree("clustertree","clustertree");
fNCaloClustersOld=event->GetNumberOfCaloClusters() ;
MakeDigits(signal);
fPHOSReconstructor->Reconstruct(fDigitsTree,fClustersTree) ;
fPHOSReconstructor->FillESD(fDigitsTree, fClustersTree, event) ;
}
void AliPHOSEmbedding::ConvertESDtoAOD(AliESDEvent* esd)
{
if(!esd)return;
AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillExtension(kTRUE);
ConvertHeader(*esd);
Int_t nTracks = esd->GetNumberOfTracks();
Int_t nV0s = esd->GetNumberOfV0s();
Int_t nCascades = esd->GetNumberOfCascades();
Int_t nKinks = esd->GetNumberOfKinks();
Int_t nVertices = nV0s + nCascades + nKinks + 1 ;
Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD();
Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();
nVertices+=nPileSPDVertices;
nVertices+=nPileTrkVertices;
Int_t nJets = 0;
Int_t nCaloClus = esd->GetNumberOfCaloClusters();
Int_t nFmdClus = 0;
Int_t nPmdClus = esd->GetNumberOfPmdTracks();
AODEvent()->ResetStd(nTracks, nVertices, nV0s, nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
ConvertPrimaryVertices(*esd);
ConvertCaloClusters(*esd);
ConvertEMCALCells(*esd);
ConvertPHOSCells(*esd);
}
void AliPHOSEmbedding::ConvertPHOSCells(const AliESDEvent& esd)
{
if (esd.GetPHOSCells()) {
AliESDCaloCells &esdPHcells = *(esd.GetPHOSCells());
Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
aodPHcells.CreateContainer(nPHcell);
aodPHcells.SetType(AliAODCaloCells::kPHOSCell);
for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell),esdPHcells.GetTime(iCell),-1,0.);
}
aodPHcells.Sort();
}
}
void AliPHOSEmbedding::ConvertEMCALCells(const AliESDEvent& esd)
{
if (esd.GetEMCALCells()) {
AliESDCaloCells &esdEMcells = *(esd.GetEMCALCells());
Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
aodEMcells.CreateContainer(nEMcell);
aodEMcells.SetType(AliAODCaloCells::kEMCALCell);
for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell),esdEMcells.GetTime(iCell));
}
aodEMcells.Sort();
}
}
void AliPHOSEmbedding::ConvertCaloClusters(const AliESDEvent& esd)
{
TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
Int_t jClusters(0);
for (Int_t iClust=fNCaloClustersOld; iClust<esd.GetNumberOfCaloClusters(); ++iClust) {
AliESDCaloCluster * cluster = esd.GetCaloCluster(iClust);
Int_t id = cluster->GetID();
Int_t nLabel = cluster->GetNLabels();
Int_t *labels = cluster->GetLabels();
Float_t energy = cluster->E();
Float_t posF[3] = { 0.};
cluster->GetPosition(posF);
AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
nLabel,
labels,
energy,
posF,
NULL,
cluster->GetType(),0);
Double_t dx=cluster->GetTrackDx() ;
Double_t dz=cluster->GetTrackDz() ;
Float_t cpv=99. ;
TArrayI * itracks = cluster->GetTracksMatched() ;
if(itracks->GetSize()>0){
Int_t iTr = itracks->At(0);
if(iTr>=0 && iTr<esd.GetNumberOfTracks()){
AliESDtrack *track = esd.GetTrack(iTr) ;
Double_t pt = track->Pt() ;
Short_t charge = track->Charge() ;
cpv=TestCPV(dx, dz, pt,charge) ;
}
}
caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
cluster->GetDispersion(),
cluster->GetM20(), cluster->GetM02(),
cpv,
cluster->GetNExMax(),cluster->GetTOF()) ;
caloCluster->SetPIDFromESD(cluster->GetPID());
caloCluster->SetNCells(cluster->GetNCells());
caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
}
caloClusters.Expand(jClusters);
}
void AliPHOSEmbedding::ConvertEmbeddedClusters(const AliESDEvent* esd)
{
Int_t jClusters(0);
fEmbeddedClusters->Clear();
fEmbeddedClusters->Expand(esd->GetNumberOfCaloClusters()-fNCaloClustersOld) ;
for (Int_t iClust=fNCaloClustersOld; iClust<esd->GetNumberOfCaloClusters(); ++iClust) {
AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
Int_t id = cluster->GetID();
Int_t nLabel = cluster->GetNLabels();
Int_t *labels = cluster->GetLabels();
Float_t energy = cluster->E();
Float_t posF[3] = { 0.};
cluster->GetPosition(posF);
AliAODCaloCluster *caloCluster = new((*fEmbeddedClusters)[jClusters++]) AliAODCaloCluster(id,
nLabel,
labels,
energy,
posF,
NULL,
cluster->GetType(),0);
Double_t dx=cluster->GetTrackDx() ;
Double_t dz=cluster->GetTrackDz() ;
Float_t cpv=99. ;
TArrayI * itracks = cluster->GetTracksMatched() ;
if(itracks->GetSize()>0){
Int_t iTr = itracks->At(0);
if(iTr>=0 && iTr<esd->GetNumberOfTracks()){
AliESDtrack *track = esd->GetTrack(iTr) ;
Double_t pt = track->Pt() ;
Short_t charge = track->Charge() ;
cpv=TestCPV(dx, dz, pt,charge) ;
}
}
caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
cluster->GetDispersion(),
cluster->GetM20(), cluster->GetM02(),
cpv,
cluster->GetNExMax(),cluster->GetTOF()) ;
caloCluster->SetPIDFromESD(cluster->GetPID());
caloCluster->SetNCells(cluster->GetNCells());
caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
}
for(Int_t i=0;i<fEmbeddedClusters->GetEntriesFast();i++){
AliAODCaloCluster *caloCluster =(AliAODCaloCluster *)fEmbeddedClusters->At(i) ;
caloCluster->GetID() ;
}
if (esd->GetPHOSCells()) {
AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
fEmbeddedCells->CreateContainer(nPHcell);
fEmbeddedCells->SetType(AliAODCaloCells::kPHOSCell);
for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
fEmbeddedCells->SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell),esdPHcells.GetTime(iCell));
}
fEmbeddedCells->Sort();
}
}
void AliPHOSEmbedding::ConvertMCParticles(const AliAODEvent* aod)
{
TClonesArray *mcArray = (TClonesArray*)aod->FindListObject(AliAODMCParticle::StdBranchName());
TClonesArray * aodMcParticles = (TClonesArray*)AODEvent()->FindListObject(AliAODMCParticle::StdBranchName());
for(Int_t i=0;i<mcArray->GetEntriesFast();i++){
AliAODMCParticle* aodpart = (AliAODMCParticle*) mcArray->At(i);
new ((*aodMcParticles)[i]) AliAODMCParticle(*aodpart);
}
}
void AliPHOSEmbedding::ConvertHeader(AliESDEvent & esd){
AliAODHeader* header = dynamic_cast<AliAODHeader*>(AODEvent()->GetHeader());
if(!header) AliFatal("Not a standard AOD");
header->SetRunNumber(esd.GetRunNumber());
header->SetOfflineTrigger(fInputHandler->IsEventSelected());
TTree* tree = fInputHandler->GetTree();
if (tree) {
TFile* file = tree->GetCurrentFile();
if (file) header->SetESDFileName(file->GetName());
}
header->SetBunchCrossNumber(esd.GetBunchCrossNumber());
header->SetOrbitNumber(esd.GetOrbitNumber());
header->SetPeriodNumber(esd.GetPeriodNumber());
header->SetEventType(esd.GetEventType());
header->SetEventNumberESDFile(esd.GetHeader()->GetEventNumberInFile());
if(const_cast<AliESDEvent&>(esd).GetCentrality()){
header->SetCentrality(const_cast<AliESDEvent&>(esd).GetCentrality());
}
else{
header->SetCentrality(0);
}
if(const_cast<AliESDEvent&>(esd).GetEventplane()){
header->SetEventplane(const_cast<AliESDEvent&>(esd).GetEventplane());
}
else{
header->SetEventplane(0);
}
header->SetFiredTriggerClasses(esd.GetFiredTriggerClasses());
header->SetTriggerMask(esd.GetTriggerMask());
header->SetTriggerCluster(esd.GetTriggerCluster());
header->SetL0TriggerInputs(esd.GetHeader()->GetL0TriggerInputs());
header->SetL1TriggerInputs(esd.GetHeader()->GetL1TriggerInputs());
header->SetL2TriggerInputs(esd.GetHeader()->GetL2TriggerInputs());
header->SetMagneticField(esd.GetMagneticField());
header->SetMuonMagFieldScale(esd.GetCurrentDip()/6000.);
header->SetZDCN1Energy(esd.GetZDCN1Energy());
header->SetZDCP1Energy(esd.GetZDCP1Energy());
header->SetZDCN2Energy(esd.GetZDCN2Energy());
header->SetZDCP2Energy(esd.GetZDCP2Energy());
header->SetZDCEMEnergy(esd.GetZDCEMEnergy(0),esd.GetZDCEMEnergy(1));
const AliMultiplicity *mult = esd.GetMultiplicity();
for (Int_t ilay = 0; ilay < 6; ilay++) header->SetITSClusters(ilay, mult->GetNumberOfITSClusters(ilay));
header->SetTPConlyRefMultiplicity(-1);
Float_t diamxy[2]={static_cast<Float_t>(esd.GetDiamondX()),static_cast<Float_t>(esd.GetDiamondY())};
Float_t diamcov[3];
esd.GetDiamondCovXY(diamcov);
header->SetDiamond(diamxy,diamcov);
header->SetDiamondZ(esd.GetDiamondZ(),esd.GetSigma2DiamondZ());
char path[255] ;
TGeoHMatrix * m ;
for(Int_t mod=0; mod<5; mod++){
snprintf(path,255,"/ALIC_1/PHOS_%d",mod+1) ;
if (gGeoManager->cd(path)){
m = gGeoManager->GetCurrentMatrix() ;
header->SetPHOSMatrix(new TGeoHMatrix(*m),mod) ;
}
else{
header->SetPHOSMatrix(NULL,mod) ;
}
}
AliEventplane *eventplane = esd.GetEventplane();
Double_t epQ = eventplane->GetEventplane("Q");
header->SetZDCN1Energy(epQ) ;
AliCentrality *centrality = esd.GetCentrality();
Double_t acentrality=centrality->GetCentralityPercentileUnchecked("V0M");
header->SetZDCN2Energy(acentrality) ;
}
void AliPHOSEmbedding::ConvertPrimaryVertices(AliESDEvent const&esd){
Int_t fNumberOfVertices = 0;
Double_t pos[3] = { 0. };
Double_t covVtx[6] = { 0. };
const AliESDVertex *vtx = esd.GetPrimaryVertex();
vtx->GetXYZ(pos);
vtx->GetCovMatrix(covVtx);
TClonesArray * vertexes=AODEvent()->GetVertices();
AliAODVertex* primaryVertex = new((*vertexes)[fNumberOfVertices++])
AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
primaryVertex->SetName(vtx->GetName());
primaryVertex->SetTitle(vtx->GetTitle());
TString vtitle = vtx->GetTitle();
if (!vtitle.Contains("VertexerTracks"))
primaryVertex->SetNContributors(vtx->GetNContributors());
if (fDebug > 0) primaryVertex->Print();
const AliESDVertex *vtxS = esd.GetPrimaryVertexSPD();
vtxS->GetXYZ(pos);
vtxS->GetCovMatrix(covVtx);
AliAODVertex * mVSPD = new((*vertexes)[fNumberOfVertices++])
AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);
mVSPD->SetName(vtxS->GetName());
mVSPD->SetTitle(vtxS->GetTitle());
mVSPD->SetNContributors(vtxS->GetNContributors());
for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesSPD(); ++iV)
{
const AliESDVertex *vtxP = esd.GetPileupVertexSPD(iV);
vtxP->GetXYZ(pos);
vtxP->GetCovMatrix(covVtx);
AliAODVertex * pVSPD = new((*vertexes)[fNumberOfVertices++])
AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);
pVSPD->SetName(vtxP->GetName());
pVSPD->SetTitle(vtxP->GetTitle());
pVSPD->SetNContributors(vtxP->GetNContributors());
}
for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesTracks(); ++iV)
{
const AliESDVertex *vtxP = esd.GetPileupVertexTracks(iV);
vtxP->GetXYZ(pos);
vtxP->GetCovMatrix(covVtx);
AliAODVertex * pVTRK = new((*vertexes)[fNumberOfVertices++])
AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);
pVTRK->SetName(vtxP->GetName());
pVTRK->SetTitle(vtxP->GetTitle());
pVTRK->SetNContributors(vtxP->GetNContributors());
}
}
void AliPHOSEmbedding::MakeDigits(AliAODEvent * signal){
fDigitsArr->Clear() ;
fDigitsTree->Branch("PHOS","TClonesArray", &fDigitsArr, 32000);
Int_t ndigit=0 ;
for (Short_t icell = 0; icell < fCellsPHOS->GetNumberOfCells(); icell++) {
Short_t id=0;
Double_t time=0., amp=0. ;
Int_t mclabel;
Double_t efrac =0. ;
if (fCellsPHOS->GetCell(icell, id, amp, time,mclabel, efrac) != kTRUE)
break;
new((*fDigitsArr)[ndigit]) AliPHOSDigit(-1,id,float(amp),float(time),ndigit);
ndigit++;
}
TClonesArray sdigits("AliPHOSDigit",0) ;
Int_t isdigit=0 ;
if(signal){
AliAODCaloCells* cellsS = signal->GetPHOSCells();
Int_t cellLabels[1000]={0} ;
for(Int_t i=0;i<cellsS->GetNumberOfCells();i++){
cellLabels[i]=-1 ;
}
sdigits.Expand(cellsS->GetNumberOfCells());
for(Int_t i=0; i<signal->GetNumberOfCaloClusters(); i++) {
AliVCluster *clus = signal->GetCaloCluster(i);
if(!clus->IsPHOS())
continue;
Int_t label = clus->GetLabel();
UShort_t * index = clus->GetCellsAbsId() ;
for(Int_t ic=0; ic < clus->GetNCells(); ic++ ){
for (Int_t icell = 0; icell < cellsS->GetNumberOfCells(); icell++){
Short_t cellNumber;
Double_t cellAmplitude=0., cellTime=0. ;
Int_t mclabel;
Double_t efrac =0. ;
cellsS->GetCell(icell, cellNumber, cellAmplitude, cellTime,mclabel,efrac) ;
if(cellNumber==index[ic]){
cellLabels[icell]=label;
break ;
}
}
}
}
for (Int_t icell = 0; icell < cellsS->GetNumberOfCells(); icell++) {
Short_t cellNumber;
Double_t cellAmplitude=0., cellTime=0. ;
Int_t mclabel;
Double_t efrac =0. ;
if (cellsS->GetCell(icell, cellNumber, cellAmplitude, cellTime,mclabel,efrac) != kTRUE)
break;
if(cellLabels[icell]==-1){
continue ;
}
new(sdigits[isdigit]) AliPHOSDigit(cellLabels[icell],cellNumber,float(cellAmplitude),float(cellTime),isdigit);
isdigit++;
}
}
Int_t icurrent = 0 ;
fDigitsArr->Expand(ndigit+isdigit) ;
for(Int_t i=0; i<isdigit;i++){
AliPHOSDigit * sdigit=static_cast<AliPHOSDigit*>(sdigits.At(i)) ;
Bool_t added=kFALSE ;
for(Int_t id=icurrent;id<ndigit;id++){
AliPHOSDigit * digit=static_cast<AliPHOSDigit*>(fDigitsArr->At(id)) ;
if(sdigit->GetId() == digit->GetId() ){
*digit += *sdigit ;
icurrent=id+1 ;
added=kTRUE ;
break ;
}
if(sdigit->GetId() < digit->GetId() ){
icurrent=id ;
break ;
}
}
if(!added){
new((*fDigitsArr)[ndigit]) AliPHOSDigit(*sdigit) ;
ndigit++ ;
}
}
for(Int_t i=0; i<ndigit;i++){
AliPHOSDigit * digit=static_cast<AliPHOSDigit*>(fDigitsArr->At(i)) ;
Float_t calib =fPHOSReconstructor->Calibrate(1.,digit->GetId()) ;
if(calib>0.)
digit->SetEnergy(digit->GetEnergy()/calib) ;
}
fDigitsArr->Sort() ;
for (Int_t i = 0 ; i < ndigit ; i++) {
AliPHOSDigit *digit = static_cast<AliPHOSDigit*>( fDigitsArr->At(i) ) ;
digit->SetIndexInList(i) ;
}
fDigitsTree->Fill() ;
}
void AliPHOSEmbedding::SetOldCalibration(TH2F **calibH){
gROOT->cd() ;
char name[55] ;
for(Int_t i=0;i<5;i++){
fOldPHOSCalibration[i] = new TH2F(*((TH2F*)calibH[i])) ;
snprintf(name,55,"OldPHOSCalibrationMod%d",i) ;
fOldPHOSCalibration[i]->SetName(name) ;
}
}
void AliPHOSEmbedding::InitMF(){
printf("............Init MF \n") ;
AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
AliGRPObject * aGRPData=0 ;
if (entry) {
TMap* m = dynamic_cast<TMap*>(entry->GetObject());
if (m) {
AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
m->Print();
aGRPData = new AliGRPObject();
aGRPData->ReadValuesFromMap(m);
}
else {
AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
aGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject());
entry->SetOwner(0);
}
}
if (!aGRPData) {
AliError("No GRP entry found in OCDB!");
return ;
}
TString lhcState = aGRPData->GetLHCState();
if (lhcState==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
lhcState = "UNKNOWN";
}
TString beamType = aGRPData->GetBeamType();
if (beamType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
beamType = "UNKNOWN";
}
Float_t beamEnergy = aGRPData->GetBeamEnergy();
if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
beamEnergy = 0;
}
TString runType = aGRPData->GetRunType();
if (runType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
runType = "UNKNOWN";
}
if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
AliInfo("PHOSEmbedding: MF is locked - GRP information will be ignored !");
AliInfo("Running with the externally locked B field !");
}
else {
AliInfo("Destroying existing B field instance!");
delete TGeoGlobalMagField::Instance();
}
}
if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
Bool_t ok = kTRUE;
Float_t l3Current = aGRPData->GetL3Current((AliGRPObject::Stats)0);
if (l3Current == AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the L3 current !");
ok = kFALSE;
}
Char_t l3Polarity = aGRPData->GetL3Polarity();
if (l3Polarity == AliGRPObject::GetInvalidChar()) {
AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
ok = kFALSE;
}
Float_t diCurrent = aGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
if (diCurrent == AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the dipole current !");
ok = kFALSE;
}
Char_t diPolarity = aGRPData->GetDipolePolarity();
if (diPolarity == AliGRPObject::GetInvalidChar()) {
AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
ok = kFALSE;
}
Int_t polConvention = aGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
Bool_t uniformB = aGRPData->IsUniformBMap();
if (ok) {
AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
TMath::Abs(diCurrent) * (diPolarity ? -1:1),
polConvention,uniformB,beamEnergy, beamType.Data());
if (fld) {
TGeoGlobalMagField::Instance()->SetField( fld );
TGeoGlobalMagField::Instance()->Lock();
AliInfo("Running with the B field constructed out of GRP !");
}
else AliFatal("Failed to create a B field map !");
}
else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
}
}
void AliPHOSEmbedding::InitGeometry(){
if (!gGeoManager) {
AliGeomManager::LoadGeometry("geometry.root");
if (!gGeoManager) {
AliFatal("Can not load geometry");
}
if(!AliGeomManager::CheckSymNamesLUT("PHOS")) {
AliFatal("CheckSymNamesLUT");
}
}
TString detStr = "PHOS";
TString loadAlObjsListOfDets = "PHOS";
if(AliGeomManager::GetNalignable("GRP") != 0)
loadAlObjsListOfDets.Prepend("GRP ");
AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
}
Float_t AliPHOSEmbedding::TestCPV(Double_t dx, Double_t dz, Double_t pt, Int_t charge){
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) ;
AliESDEvent *event = static_cast<AliESDEvent*>(InputEvent());
Double_t mf = event->GetMagneticField();
if(mf<0.){
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{
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 ;
return TMath::Sqrt(rx*rx+rz*rz) ;
}
AliPHOSEmbedding.cxx:1000 AliPHOSEmbedding.cxx:1001 AliPHOSEmbedding.cxx:1002 AliPHOSEmbedding.cxx:1003 AliPHOSEmbedding.cxx:1004 AliPHOSEmbedding.cxx:1005 AliPHOSEmbedding.cxx:1006 AliPHOSEmbedding.cxx:1007 AliPHOSEmbedding.cxx:1008 AliPHOSEmbedding.cxx:1009 AliPHOSEmbedding.cxx:1010 AliPHOSEmbedding.cxx:1011 AliPHOSEmbedding.cxx:1012 AliPHOSEmbedding.cxx:1013 AliPHOSEmbedding.cxx:1014 AliPHOSEmbedding.cxx:1015 AliPHOSEmbedding.cxx:1016 AliPHOSEmbedding.cxx:1017 AliPHOSEmbedding.cxx:1018 AliPHOSEmbedding.cxx:1019 AliPHOSEmbedding.cxx:1020 AliPHOSEmbedding.cxx:1021 AliPHOSEmbedding.cxx:1022 AliPHOSEmbedding.cxx:1023 AliPHOSEmbedding.cxx:1024 AliPHOSEmbedding.cxx:1025 AliPHOSEmbedding.cxx:1026 AliPHOSEmbedding.cxx:1027 AliPHOSEmbedding.cxx:1028 AliPHOSEmbedding.cxx:1029 AliPHOSEmbedding.cxx:1030 AliPHOSEmbedding.cxx:1031 AliPHOSEmbedding.cxx:1032 AliPHOSEmbedding.cxx:1033 AliPHOSEmbedding.cxx:1034 AliPHOSEmbedding.cxx:1035 AliPHOSEmbedding.cxx:1036 AliPHOSEmbedding.cxx:1037 AliPHOSEmbedding.cxx:1038 AliPHOSEmbedding.cxx:1039 AliPHOSEmbedding.cxx:1040 AliPHOSEmbedding.cxx:1041 AliPHOSEmbedding.cxx:1042 AliPHOSEmbedding.cxx:1043 AliPHOSEmbedding.cxx:1044 AliPHOSEmbedding.cxx:1045 AliPHOSEmbedding.cxx:1046 AliPHOSEmbedding.cxx:1047 AliPHOSEmbedding.cxx:1048 AliPHOSEmbedding.cxx:1049 AliPHOSEmbedding.cxx:1050 AliPHOSEmbedding.cxx:1051 AliPHOSEmbedding.cxx:1052 AliPHOSEmbedding.cxx:1053 AliPHOSEmbedding.cxx:1054 AliPHOSEmbedding.cxx:1055 AliPHOSEmbedding.cxx:1056 AliPHOSEmbedding.cxx:1057 AliPHOSEmbedding.cxx:1058 AliPHOSEmbedding.cxx:1059 AliPHOSEmbedding.cxx:1060 AliPHOSEmbedding.cxx:1061 AliPHOSEmbedding.cxx:1062 AliPHOSEmbedding.cxx:1063 AliPHOSEmbedding.cxx:1064 AliPHOSEmbedding.cxx:1065 AliPHOSEmbedding.cxx:1066