#include "AliPHOSCalibrationData.h"
ClassImp(AliPHOSCalibrManager)
-
-AliPHOSCalibrManager * AliPHOSCalibrManager::fgCaMa = 0 ;
+
+ AliPHOSCalibrManager * AliPHOSCalibrManager::fgCaMa = 0 ;
//____________________________________________________________________________
AliPHOSCalibrManager::AliPHOSCalibrManager():TNamed()
{
// default ctor: not to be used
+ fInputKind = 0 ;
+ fFileName= "" ;
fctdb = 0 ;
- fFileName="" ;
Fatal("Default constructor","Should not use") ;
}
//____________________________________________________________________________
-AliPHOSCalibrManager::AliPHOSCalibrManager(const char* filename ):
+AliPHOSCalibrManager::AliPHOSCalibrManager(const char* filename,const char * kind ):
TNamed("AliPHOSCalibrManager",filename){
- fFileName = filename ;
+ if(strcmp(kind,"root")==0){
+ fInputKind = 0 ;
+ }
+ else{
+ fInputKind = 1 ;
+ }
+ fFileName = filename;
fctdb = 0 ;
}
//____________________________________________________________________________
- AliPHOSCalibrManager::~AliPHOSCalibrManager()
+AliPHOSCalibrManager::~AliPHOSCalibrManager()
{
//dtor
- TFile * f = gROOT->GetFile(fFileName) ;
- if(f && f->IsOpen())
- f->Close() ;
- if(fctdb)
- delete fctdb ;
- fctdb = 0 ;
+ if(fInputKind==0){
+ TFile * f = gROOT->GetFile(fFileName) ;
+ if(f && f->IsOpen())
+ f->Close() ;
+ }
}
//____________________________________________________________________________
AliPHOSCalibrManager * AliPHOSCalibrManager::GetInstance(void)
{
// gets the instance of the unique object
- return fgCaMa ;
+ return fgCaMa ;
}
//____________________________________________________________________________
-AliPHOSCalibrManager * AliPHOSCalibrManager::GetInstance(const char* filename )
+AliPHOSCalibrManager * AliPHOSCalibrManager::GetInstance(const char* filename,const char * kind)
{
// Opens source (now only root file) and
// returns the instance of the unique object
-
+
if(!fgCaMa)
- fgCaMa = new AliPHOSCalibrManager(filename) ;
+ fgCaMa = new AliPHOSCalibrManager(filename,kind) ;
else{
- if(strcmp(filename,fgCaMa->fFileName.Data())){
- //Close previous file, construct new Manager
- delete fgCaMa ;
- fgCaMa = new AliPHOSCalibrManager(filename) ;
- }
+ if(strcmp(filename,fgCaMa->fFileName.Data())){
+ //Close previous file, construct new Manager
+ delete fgCaMa ;
+ fgCaMa = new AliPHOSCalibrManager(filename,kind) ;
+ }
}
return fgCaMa ;
}
//____________________________________________________________________________
-void AliPHOSCalibrManager::ReadFromASCII(AliPHOSCalibrationData &data,const char * filename)
-{
- //reads calibration parameters from ascii file
+void AliPHOSCalibrManager::GetParameters(AliPHOSCalibrationData &data){
+ if(fInputKind == 0){
+ ReadFromRoot(data) ;
+ }
+ else{
+ ReadFromASCII(data) ;
+ }
+}
+//____________________________________________________________________________
+void AliPHOSCalibrManager::ReadFromASCII(AliPHOSCalibrationData &data){
+ // We read pedestals and gains from *.dat file with following format:
+ // 0 0 0 0 37.09 1972. // next nmodrows*nmodcols*ncryrows*ncrycols lines
+ // 0 0 0 1 28.53 2072. // contains <RR CC r c ped peak>
+ // 0 0 0 2 30.93 1938. //
+ // where module is an array of 8*8 crystals and RR and CC are module raw and column position
if(!fctdb){
Error("ReadCalibrationParameters", "Specify Connections Table Database first") ;
return ;
}
- ifstream file(filename) ;
- for(Int_t i = 1; i<=64; i++){
- Float_t inp ;
- file >> inp ;
- data.SetData(fctdb->Raw2AbsId(i),static_cast<Float_t>(inp));
+
+ FILE * file = fopen(fFileName, "r");
+ if (!file) {
+ Error("ReadFromASCII", "could not open file %s", fFileName.Data());
+ return;
+ }
+
+ Bool_t isPed = kFALSE ;
+ if(strcmp(data.GetCategory(),"Pedestals")==0){
+ isPed = 1 ;
+ }
+ else{
+ if(strcmp(data.GetCategory(),"Gains")){
+ Error("ReadFromASCII","Unknown data category: %s",data.GetCategory()) ;
+ return ;
+ }
+ }
+
+ Int_t modRaw,modCol,raw,col;
+ Float_t ped,pik;
+ Int_t nread = 0 ;
+ while(fscanf(file,"%d %d %d %d %f %f",&modRaw,&modCol,&raw,&col,&ped,&pik)==6){
+ //Calculate plain crystal position:
+ Int_t rawPosition = (modRaw*8+raw)*fctdb->GetNColumns()+modCol*8+col ;
+ Int_t absId = fctdb->Raw2AbsId(rawPosition);
+ if(isPed){
+ data.SetData(absId,ped) ;
+ }
+ else{
+ if(pik!=0.)
+ data.SetData(absId,1./pik);
+ else
+ data.SetData(absId,0.);
+ }
+ nread++ ;
+ }
+ if(nread != fctdb->GetNColumns()*fctdb->GetNRaws()){
+ Error("ReadFromASCII","Read %d parameters instead of %d\n",nread,fctdb->GetNColumns()*fctdb->GetNRaws()) ;
}
- file.close();
+ fclose(file) ;
+
}
//____________________________________________________________________________
-void AliPHOSCalibrManager::ReadFromRoot(AliPHOSCalibrationData & data,Int_t run)
+void AliPHOSCalibrManager::ReadFromRoot(AliPHOSCalibrationData & data)
{
//reads calibration parameters from root file
-
+
//construct name
TString searchname(data.GetCategory()) ;
searchname+='_' ;
searchname+=data.GetVersion() ;
- searchname+='_' ;
TFile * file = gROOT->GetFile(fFileName) ;
if(!file || !file->IsOpen())
file = TFile::Open(fFileName) ;
Error("ReadFromRoot","Can not open file %s\n",fFileName.Data() ) ;
return ;
}
- TList * list = file->GetListOfKeys() ;
- TIter next(list) ;
- TKey * key ;
- while((key=((TKey*)next()))){
- TString kname(key->GetName()) ;
- if(kname.BeginsWith(searchname)){
- TString sbegin = kname(searchname.Sizeof()-1,
- kname.Last('_')-searchname.Sizeof()+1) ;
- TString send = kname(kname.Last('_')+1,kname.Sizeof()) ;
- Int_t begin,end ;
- if(sscanf(sbegin.Data(),"%d",&begin) &&
- sscanf(send.Data(),"%d",&end)){
- if(begin<=run && end >=run){
- data=(*dynamic_cast<AliPHOSCalibrationData*>(file->Get(key->GetName()) ));
- return ;
- }
- }
- }
- }
- Error("ReadFromRoot","Can not find key %s for run %d in file %s \n",searchname.Data(),run,fFileName.Data()) ;
+ AliPHOSCalibrationData * tmp = dynamic_cast<AliPHOSCalibrationData*>(file->Get(searchname) ) ;
+ if(!tmp)
+ Error("ReadFromRoot","there is no data %s in file %s",fFileName.Data(),fFileName.Data()) ;
+ else
+ data=(*tmp);
+
+
+// TList * list = file->GetListOfKeys() ;
+// TIter next(list) ;
+// TKey * key ;
+// while((key=((TKey*)next()))){
+// TString kname(key->GetName()) ;
+// if(kname.BeginsWith(searchname)){
+// TString sbegin = kname(searchname.Sizeof()-1,
+// kname.Last('_')-searchname.Sizeof()+1) ;
+// TString send = kname(kname.Last('_')+1,kname.Sizeof()) ;
+// Int_t begin,end ;
+// if(sscanf(sbegin.Data(),"%d",&begin) &&
+// sscanf(send.Data(),"%d",&end)){
+// if(begin<=run && end >=run){
+// data=(*dynamic_cast<AliPHOSCalibrationData*>(file->Get(key->GetName()) ));
+// return ;
+// }
+// }
+// }
+// }
+// Error("ReadFromRoot","Can not find key %s for run %d in file %s \n",searchname.Data(),run,fFileName.Data()) ;
}
//____________________________________________________________________________
-void AliPHOSCalibrManager::WriteData(AliPHOSCalibrationData * data)
+void AliPHOSCalibrManager::WriteData(AliPHOSCalibrationData &data)
{
//Writes data
TFile * file = gROOT->GetFile(fFileName) ;
}
}
file->cd() ;
- TString kname(data->GetCategory()) ;
- kname+='_';
- kname+=data->GetVersion() ;
+ TString kname(data.GetCategory()) ;
kname+='_';
- Int_t begin,end ;
- data->GetValidityRange(begin,end) ;
- kname+=begin ;
- kname+='_' ;
- kname+=end ;
- data->Write(kname,TObject::kOverwrite) ;
+ kname+=data.GetVersion() ;
+// kname+='_';
+// Int_t begin,end ;
+// data->GetValidityRange(begin,end) ;
+// kname+=begin ;
+// kname+='_' ;
+// kname+=end ;
+ data.Write(kname,TObject::kOverwrite) ;
}
//____________________________________________________________________________
// --- ROOT system ---
// --- Standard library ---
-#include <fstream>
// --- AliRoot header files ---
-#include "AliPHOSConTableDB.h"
+#include "AliPHOSCalibrManager.h"
#include "AliPHOSCalibrationDB.h"
-#include "AliPHOSGeometry.h"
ClassImp(AliPHOSCalibrationDB)
//____________________________________________________________________________
AliPHOSCalibrationDB::AliPHOSCalibrationDB():TNamed()
{
- fPedestals = 0 ;
- fSlopes = 0;
- fNChannels = 0 ;
- fctdb = 0 ;
}
//____________________________________________________________________________
AliPHOSCalibrationDB::AliPHOSCalibrationDB(const char * database):
- TNamed("AliPHOSCalibrationDB",database){
- //Creates the containers: we prepare places for all channels in PHOS
+ TNamed("AliPHOSCalibrationDB",database),fPedestals("Pedestals"),fGains("Gains"){
- AliPHOSGeometry * geom = AliPHOSGeometry::GetInstance("IHEP","") ;
- fNChannels = geom->GetNModules()*geom->GetNPhi()*geom->GetNZ()+
- geom->GetNumberOfCPVPadsZ()*geom->GetNumberOfCPVPadsPhi()*geom->GetNModules() ;
- //Note, that to avoid shifting AbsId each time we access data, we do not use
- //first slot and index runs from 1 to fNChannels inclusively
- fPedestals = new TArrayF(fNChannels+1) ;
- fSlopes = new TArrayF(fNChannels+1) ;
- fctdb = 0 ;
}
//____________________________________________________________________________
AliPHOSCalibrationDB::~AliPHOSCalibrationDB()
{
- if(fPedestals)
- delete fPedestals ;
- if(fSlopes)
- delete fSlopes ;
}
//____________________________________________________________________________
Float_t AliPHOSCalibrationDB::Calibrate(Int_t amp, Int_t absId)const
{
//if absID is known, return calibrated energy, else - zero
- if(absId <=0 || absId > fNChannels)
- return 0.0000001 ;
-
- Float_t ret = (amp - fPedestals->At(absId))*fSlopes->At(absId);
+ Float_t ret = (amp - fPedestals.Data(absId))*fGains.Data(absId);
if(ret > 0)
return ret ;
else
return 0.0000001 ; //Should not be zero - to avoid FPE
}
-//____________________________________________________________________________
-void AliPHOSCalibrationDB::SetAll(Float_t pedestal, Float_t slope){
- //Set all calibration parameters to the same value
- if(fPedestals)
- for(Int_t i=0;i<fNChannels;i++){
- fPedestals->AddAt(pedestal,i) ;
- fSlopes->AddAt(slope,i);
- }
- else
- Warning("SetAll", "Please, create me with non-default constructor!") ;
-}
//____________________________________________________________________________
-void AliPHOSCalibrationDB::ReadCalibrationParameters(const char * filename, Option_t* opt){
- //reads calibration parameters from ascii file
+void AliPHOSCalibrationDB::GetParameters(void){
+ //In this method we read calibration parameters using AliPHOSCalibrManager
+ //This manager should be configured to read from correct source.
- if(strcmp(opt,"gains")==0){ //read gains
- if(!fctdb){
- Error("ReadCalibrationParameters", "Specify Connections Table Database first") ;
- return ;
- }
- ifstream gainfile(filename) ;
- for(Int_t i = 1; i<=64; i++){
- Float_t slope ;
- gainfile >> slope ;
- fSlopes->AddAt(slope,fctdb->Raw2AbsId(i));
- }
- gainfile.close();
+ AliPHOSCalibrManager * man = AliPHOSCalibrManager::GetInstance() ;
+ if(!man){
+ Error("GetParameters","AliPHOSCalibrManager not instanciated") ;
+ return ;
}
- else
- if(strstr(opt,"pedest")){ //read pedestals
- if(!fctdb){
- Error("ReadCalibrationParameters", "Specify Connections Table Database first") ;
- return ;
- }
- ifstream pfile(filename) ;
- for(Int_t i = 1; i<=64; i++){
- Float_t pedestal ;
- pfile >> pedestal ;
- fPedestals->AddAt(pedestal,fctdb->Raw2AbsId(i));
- }
- pfile.close();
- }
- else{
- Warning("ReadCalibrationParameters", "Available options are\n `gains' : to read gains\n `pedestals : to read pedestals ") ;
- }
+
+ man->GetParameters(fPedestals) ;
+ man->GetParameters(fGains) ;
+
}
//____________________________________________________________________________
AliPHOSCalibrationDB& AliPHOSCalibrationDB::operator=(AliPHOSCalibrationDB const & cdb)
{
//
- fNChannels = cdb.fNChannels;
- fFileName = cdb.fFileName;
fPedestals=cdb.fPedestals ;
- fSlopes = cdb.fSlopes;
+ fGains = cdb.fGains;
return *this ;
}
// --- ROOT system ---
#include "TNamed.h"
-#include "TArrayF.h"
#include "TString.h"
// --- Standard library ---
// --- AliRoot header files ---
-class AliPHOSConTableDB ;
+#include "AliPHOSCalibrationData.h"
class AliPHOSCalibrationDB:public TNamed {
//Main method: calibrates if gains are known, otherwise - returns 0
Float_t Calibrate(Int_t amp, Int_t absId)const ;
- //Read gains of pedestals from ascii file
- void ReadCalibrationParameters(const char * filename = "gains.dat",Option_t* opt = "gains") ;
-
- //Sets the same parameters for all channels
- void SetAll(Float_t pedestal = 0, Float_t slope = 0.01) ;
-
- //To know correspondance when reads list of gains from ascii file
- void SetConTableDB(AliPHOSConTableDB * ctdb){fctdb = ctdb; }
-
- //Set parameters for particlular channel
- void SetParameters(Int_t AbsId, Float_t pedestal = 0, Float_t slope = 0.01)
- {if(fPedestals){fPedestals->AddAt(pedestal,AbsId-1) ; fSlopes->AddAt(slope,AbsId-1) ;} }
-
- //To be replaced in real DB when updating will really be necessary
- void Update(Int_t /*event*/,Int_t /*run*/){}
+ //Get calibration parameters using AliPHOSCalibrManager
+ void GetParameters(void) ;
AliPHOSCalibrationDB & operator = (const AliPHOSCalibrationDB & ) ;
private:
- Int_t fCurentRun ; //!
- Int_t fNChannels ;
- TString fFileName ;
- TArrayF * fPedestals ;
- TArrayF * fSlopes ;
- AliPHOSConTableDB * fctdb ; //!
+
+ AliPHOSCalibrationData fPedestals ;
+ AliPHOSCalibrationData fGains ;
ClassDef(AliPHOSCalibrationDB,1) // description