// Root
#include "TLorentzVector.h"
#include "TVector3.h"
-#include "TGeoManager.h"
#include "TRefArray.h"
#include "TList.h"
// AliRoot
#include "AliAnalysisTaskPHOSPi0CalibSelection.h"
-#include "AliCDBEntry.h"
-#include "AliCDBManager.h"
#include "AliAODEvent.h"
-#include "AliPHOSPIDv1.h"
+#include "AliESDEvent.h"
#include "AliPHOSAodCluster.h"
-#include "AliPHOSGeoUtils.h"
-#include "AliPHOSCalibData.h"
-#include "AliPHOSReconstructor.h"
#include "AliPHOSPIDv1.h"
-
ClassImp(AliAnalysisTaskPHOSPi0CalibSelection)
AliAnalysisTaskPHOSPi0CalibSelection::AliAnalysisTaskPHOSPi0CalibSelection() :
-AliAnalysisTaskSE(),fOutputContainer(0x0),fRecoParam(0x0),fPhosGeo(0x0),fHmgg(0x0),
- fEmin(0.)
+AliAnalysisTaskSE(),fOutputContainer(0x0),fPhosGeo(0x0),fCalibData(0x0),fHmgg(0x0),
+ fEmin(0.), fLogWeight(4.5)
{
//Default constructor.
}
AliAnalysisTaskPHOSPi0CalibSelection::AliAnalysisTaskPHOSPi0CalibSelection(const char* name) :
- AliAnalysisTaskSE(name),fOutputContainer(0x0),fRecoParam(0x0),fPhosGeo(0x0),fHmgg(0x0),
- fEmin(0.)
+ AliAnalysisTaskSE(name),fOutputContainer(0x0),fPhosGeo(0x0),fCalibData(0x0),fHmgg(0x0),
+ fEmin(0.), fLogWeight(4.5)
{
//Named constructor which should be used.
fOutputContainer->Delete() ;
delete fOutputContainer ;
}
+
+ if(fCalibData) delete fCalibData;
+ if(fPhosGeo) delete fPhosGeo;
+
}
void AliAnalysisTaskPHOSPi0CalibSelection::UserCreateOutputObjects()
Int_t runNum = aod->GetRunNumber();
printf("Run number: %d\n",runNum);
-
- if(!fPhosGeo) {
-
- AliCDBEntry* entryGeo = AliCDBManager::Instance()->Get("GRP/Geometry/Data",runNum);
- if(!entryGeo) AliFatal("No Geometry entry found in OCDB!!");
-
- TGeoManager* geoManager = dynamic_cast<TGeoManager*>(entryGeo->GetObject());
- if(!geoManager) AliFatal("No valid TGeoManager object found in the OCDB.");
-
- gGeoManager = geoManager;
- fPhosGeo = AliPHOSGeometry::GetInstance("IHEP") ;
- }
-
- //Calibrations from previous iteration
- AliPHOSCalibData calibData(runNum);
-
- //Get RecoParameters. See AliQADataMakerRec::InitRecoParams().
- if(!fRecoParam) {
-
- AliCDBEntry* entryRecoPar = AliCDBManager::Instance()->Get("PHOS/Calib/RecoParam",runNum);
- if(!entryRecoPar) AliFatal("No RecoParam entry in OCDB!!");
-
- TObject * recoParamObj = entryRecoPar->GetObject() ;
- AliDetectorRecoParam* rprm = 0;
-
- if (dynamic_cast<TObjArray*>(recoParamObj)) {
- TObjArray *recoParamArray = dynamic_cast<TObjArray*>(recoParamObj) ;
- for (Int_t iRP=0; iRP<recoParamArray->GetEntriesFast(); iRP++) {
- rprm = dynamic_cast<AliDetectorRecoParam*>(recoParamArray->At(iRP)) ;
- if (rprm->IsDefault()) break;
- }
- }
-
- if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
- dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
- rprm = dynamic_cast<AliDetectorRecoParam*>(recoParamObj) ;
- }
-
- if(!rprm) AliFatal("No valid RecoParam object found in the OCDB.");
- fRecoParam = dynamic_cast<AliPHOSRecoParam*>(rprm);
- if(!fRecoParam) AliFatal("recoparams are _NOT_ of type AliPHOSRecoParam!!");
+
+ //Get the matrix with geometry information
+ //Still not implemented in AOD, just a workaround to be able to work at least with ESDs
+ if(!strcmp(InputEvent()->GetName(),"AliAODEvent"))
+ printf("Use ideal geometry, values geometry matrix not kept in AODs");
+ else{
+ AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent()) ;
+ for(Int_t mod=0; mod<5; mod++)
+ fPhosGeo->SetMisalMatrix(esd->GetPHOSMatrix(mod),mod) ;
}
-
- Float_t logWeight = fRecoParam->GetEMCLogWeight();
- printf("Will use logWeight %.3f .\n",logWeight);
+
+ printf("Will use fLogWeight %.3f .\n",fLogWeight);
AliPHOSPIDv1 pid;
if(e1i<fEmin) continue;
AliPHOSAodCluster clu1(*c1);
- clu1.Recalibrate(&calibData, phsCells);
- clu1.EvalAll(logWeight,vtx);
+ clu1.Recalibrate(fCalibData, phsCells);
+ clu1.EvalAll(fLogWeight,vtx);
clu1.EnergyCorrection(&pid) ;
clu1.GetMomentum(p1,v);
if(e2i<fEmin) continue;
AliPHOSAodCluster clu2(*c2);
- clu2.Recalibrate(&calibData, phsCells);
- clu2.EvalAll(logWeight,vtx);
+ clu2.Recalibrate(fCalibData, phsCells);
+ clu2.EvalAll(fLogWeight,vtx);
clu2.EnergyCorrection(&pid) ;
clu2.GetMomentum(p2,v);
}
}
+
+void AliAnalysisTaskPHOSPi0CalibSelection::SetCalibCorrections(AliPHOSCalibData* cdata)
+{
+ //Set new correction factors (~1) to calibration coefficients, delete previous.
+
+ if(fCalibData) delete fCalibData;
+ fCalibData = cdata;
+
+}
+
// using calibration coefficients of the previous iteration. //
//---------------------------------------------------------------------------//
+// Root includes
+#include "TH1.h"
+// AliRoot includes
#include "AliAnalysisTaskSE.h"
-#include "AliPHOSRecoParam.h"
#include "AliPHOSGeometry.h"
#include "AliAODCaloCluster.h"
#include "AliAODCaloCells.h"
-#include "TH1.h"
+#include "AliPHOSCalibData.h"
class AliAnalysisTaskPHOSPi0CalibSelection : public AliAnalysisTaskSE
{
virtual void UserExec(Option_t * opt);
void SetClusterMinEnergy(Float_t emin) {fEmin=emin;}
-
+ void SetLogWeight(Float_t weight) {fLogWeight=weight;}
+ void SetCalibCorrections(AliPHOSCalibData* cdata);
+
private:
AliAnalysisTaskPHOSPi0CalibSelection(const AliAnalysisTaskPHOSPi0CalibSelection&);
TList* fOutputContainer;
TH1F* fHmpi0[5][64][56];// two-cluster inv. mass assigned to each cell.
- AliPHOSRecoParam* fRecoParam; // RecoParameters.
AliPHOSGeometry * fPhosGeo; // PHOS geometry
-
+ AliPHOSCalibData* fCalibData; // corrections to CC from the previous iteration
+
TH1F* fHmgg; //two-cluster inv.mass
Float_t fEmin; // min. cluster energy
-
- ClassDef(AliAnalysisTaskPHOSPi0CalibSelection,1);
+ Float_t fLogWeight; // log weight used in cluster recalibration
+
+ ClassDef(AliAnalysisTaskPHOSPi0CalibSelection,2);
};
void anaTask()
{
-
- AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
- AliCDBManager::Instance()->SetSpecificStorage("PHOS/*","local://./");
-
+ //Macro to run pi0 calibration on local AOD files.
+ //Author: Boris Polishchuk, adapted to AOD by Gustavo Conesa
+
+ //Uncomment the line below if your ESD files are from old productions
+ //so there are no PHOS geometry matrices written in the ESD.
+ //You can find an ideal geometry here: $ALICE_ROOT/test/QA/geometry.root
+ //and copy to your working directory.
+
+ //AliGeomManager::LoadGeometry("geometry.root");
+
+ //You can apply misalignment by following
+ //(remember that your local OCDB in ./PHOS should contain a copy of the
+ //$ALICE_ROOT/OCDB/PHOS/Align directory while ./PHOS/Calib/EmcGainPedestals
+ //should contain the corrections to the calibration coefficients (~1)
+ //instead of real CC (~0.005)! ):
+
+ // AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+ // AliCDBManager::Instance()->SetSpecificStorage("PHOS/*","local://./");
+
+ // AliCDBManager::Instance()->SetRun(0);
+ // AliCDBEntry* e = AliCDBManager::Instance()->Get("PHOS/Align/Data");
+ // TClonesArray *array = (TClonesArray*) e->GetObject();
+ // AliGeomManager::ApplyAlignObjsToGeom(*array);
+
// load analysis framework
gSystem->Load("libANALYSIS");
gSystem->Load("libANALYSISalice"); //AliAnalysisTaskSE