#include <stdlib.h>
#include "hrichrecalibrater.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hrichdetector.h"
#include "hcategory.h"
#include "hmatrixcatiter.h"
#include "hrichcal.h"
#include "richdef.h"
#include "hrichgeometrypar.h"
#include "hdetgeompar.h"
#include "hruntimedb.h"
#include "TFile.h"
#include <string.h>
#include <math.h>
#include "hrichcalparcell.h"
#include "hlocation.h"
#include "hrichcalpar.h"
ClassImp(HRichReCalibrater)
HRichReCalibrater::HRichReCalibrater(const Text_t *name, const Text_t *title,const Char_t *
path ,const Char_t * pString,Float_t fNoiseThr): HReconstructor(name,title) {
pedPathName = path;
fNoiseLim = fNoiseThr;
strcpy(sectorList,pString);
numSec = strlen(sectorList);
pRichCal = 0;
pIter = 0;
sectorMax = 6;
rowMax = 90;
colMax = 92;
hardwareMax = 17464;
size = 6.;
epsilon = 0.001;
channels = 2;
sigmaTransformation = false;
for (Int_t i=0;i<numSec;i++){
sectorList[i]=sectorList[i]-1;
}
checkInput = true;
if (numSec > sectorMax) {
cout<<"!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
cout<<"We have only 6 sectors!"<<endl;
cout<<"!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
checkInput = false;
}
if (checkInput){
createStatistics();
createMeans();
initializeStatistics();
initializeMeans();
checkSectorList();
}
}
HRichReCalibrater::~HRichReCalibrater(void) {
deleteStatistics();
deleteMeans();
}
void HRichReCalibrater::createStatistics(){
pStat = new int[numSec][92][90];
pRunAway = new int[numSec][92][90];
}
void HRichReCalibrater::createMeans(){
pDiff = new double[numSec][92][90];
pMean = new double[numSec][92][90];
pSigma = new double[numSec][92][90];
}
void HRichReCalibrater::initializeStatistics(){
for (Int_t i=0;i<numSec;i++){
for (Int_t j=0; j<colMax; j++){
for (Int_t k=0; k<rowMax; k++){
pStat[i][j][k] = 0;
pRunAway[i][j][k] = 0;
countArray[i][j][k] = 0;
}
}
}
}
void HRichReCalibrater::initializeMeans(){
for (Int_t i=0;i<numSec;i++){
for (Int_t j=0; j<colMax; j++){
for (Int_t k=0; k<rowMax; k++){
pDiff[i][j][k] = 0.;
pMean[i][j][k] = 0.;
pSigma[i][j][k] = 0.;
}
}
}
}
void HRichReCalibrater::deleteStatistics(){
delete [] pStat;
delete [] pRunAway;
}
void HRichReCalibrater::deleteMeans(){
delete [] pDiff;
delete [] pMean;
delete [] pSigma;
}
Bool_t HRichReCalibrater::checkSectorList(){
for (Int_t i = 0; i<numSec; i++){
Char_t b = sectorList[i];
if (!(b>47 && b<55)){
cout<<"Attention!!! "<<sectorList[i]+1<<" is not a valid input!"<<endl;
checkInput = false;
cout<<"checkInput = "<<checkInput<<endl;
exit(1);
}
}
return checkInput;
}
void HRichReCalibrater::fillMask(){
Int_t iX = 0;
for (Int_t i=0; i<sectorMax; i++) {
mask[i][0] = 0;
mask[i][1] = 0;
}
for (Int_t i=0; i<numSec; i++){
Int_t a = sectorList[i]-48;
mask[a][0] = 1;
mask[a][1] = iX;
iX++;
}
}
void HRichReCalibrater::bookHistos(){
Char_t * mean[6];
Char_t * mean1d[6];
Char_t * sigma[6];
Char_t * sigma1d[6];
Char_t * stat[6];
Char_t * runAway[6];
Char_t temp1[7];
Char_t temp2[9];
Char_t temp3[8];
Char_t temp4[10];
Char_t temp5[7];
Char_t temp6[10];
for (Int_t i = 0; i<sectorMax; i++){
sprintf(temp1,"mean_%d",i+1);
sprintf(temp2,"mean1d_%d",i+1);
sprintf(temp3,"sigma_%d",i+1);
sprintf(temp4,"sigma1d_%d",i+1);
sprintf(temp5,"stat_%d",i+1);
sprintf(temp6,"runAway_%d",i+1);
mean[i] = temp1;
mean1d[i] = temp2;
sigma[i] = temp3;
sigma1d[i] = temp4;
stat[i] = temp5;
runAway[i] = temp6;
meanHisto[i] = new TH2F (mean[i],mean[i],colMax,1,colMax,rowMax,1,rowMax);
sigmaHisto[i] = new TH2F (sigma[i],sigma[i],colMax,1,colMax,rowMax,1,rowMax);
mean1dHisto[i] = new TH1F (mean1d[i],mean1d[i],17464,0,17464);
sigma1dHisto[i] = new TH1F (sigma1d[i],sigma1d[i],17464,0,17464);
statHisto[i] = new TH2F (stat[i],stat[i],colMax,1,colMax,rowMax,1,rowMax);
runAwayHisto[i] = new TH2F (runAway[i],runAway[i],colMax,1,colMax,rowMax,1,rowMax);
}
}
void HRichReCalibrater::fill2DHistos(){
if (nCounter <=0){
cout<<"No Data found in any of the requested sectors !! Aborting !!"<<endl;
exit(1);
}
for (Int_t i = 0; i<sectorMax; i++){
if (mask[i][0]==1){
for (Int_t j = 0; j<colMax; j++){
for (Int_t k = 0; k<rowMax; k++){
Int_t sIx = mask[i][1];
statHisto[i]->Fill(j,k,pStat[sIx][j][k]);
runAwayHisto[i]->Fill(j,k,pRunAway[sIx][j][k]);
meanHisto[i]->Fill(j,k,pMean[sIx][j][k]);
Float_t radikand = pSigma[sIx][j][k]*countArray[sIx][j][k];
if(radikand < 0.){
sigmaHisto[i]->Fill(j,k,20000.);
cout<<" !2D! numerical problem occured "<<endl;
cout<<" radikand = "<<radikand<<" col = "<<j<<" row = "<<k<<endl;
}else{
pSigma[sIx][j][k] = sqrt(radikand);
if(pStat[sIx][j][k]==1){
pSigma[sIx][j][k]=0.01;
}
sigmaHisto[i]->Fill(j,k,pSigma[sIx][j][k]);
}
}
}
}
}
sigmaTransformation = true;
}
void HRichReCalibrater::fill1DHistos(){
for (Int_t i = 0; i<sectorMax; i++){
if (mask[i][0] == 1){
Int_t sIx = mask[i][1];
for (Int_t j = 0; j<hardwareMax; j++){
Int_t x = getCol(j);
Int_t y = getRow(j);
mean1dHisto[i]->Fill(j,pMean[sIx][x][y]);
Float_t radikand = pSigma[sIx][x][y] * pSigma[sIx][x][y];
if(radikand < 0.){
sigma1dHisto[i]->Fill(j,20000.);
cout<<" !1D! numerical problem occured "<<endl;
cout<<" radikand = "<<radikand<<" col = "<<x<<" row = "<<y<<endl;
}else{
pSigma[sIx][x][y] = sqrt(radikand);
if(pStat[sIx][x][y]==1){
pSigma[sIx][x][y]=0.01;
}
sigma1dHisto[i]->Fill(j,pSigma[sIx][x][y]);
}
}
}
}
}
Int_t HRichReCalibrater::getCol(Int_t hardwarenumber){
Int_t x = (int) (*vec5)(hardwarenumber);
return x;
}
Int_t HRichReCalibrater::getRow(Int_t hardwarenumber){
Int_t y = (int) (*vec6)(hardwarenumber);
return y;
}
void HRichReCalibrater::uipFile(){
TFile *pFile = new TFile("uipfile_new.root","read","Testfile",1);
if(pFile){
vec3 = (TVector*) pFile->Get("uip");
vec5 = (TVector*) pFile->Get("pads_x");
vec6 = (TVector*) pFile->Get("pads_y");
}
else cout << "problems opening upifile" << endl;
}
void HRichReCalibrater::bookCanvases(){
}
void HRichReCalibrater::calculate(){
HRichCal *pCal=NULL;
Bool_t kData = kFALSE;
pIter->Reset();
while( (pCal = (HRichCal *)pIter->Next()) ){
kData = kTRUE;
Int_t sec = pCal->getSector();
Float_t fCharge = pCal->getCharge();
Int_t iRow = pCal->getRow();
Int_t iCol = pCal->getCol();
if(mask[sec][0]==1){
if(iRow < rowMax && iCol < colMax){
if (fCharge<fNoiseLim){
Int_t sIx = mask[sec][1];
meanAndSigma(sIx,iCol,iRow,fCharge);
countArray[sIx][iCol][iRow]++;
pStat[sIx][iCol][iRow]= pStat[sIx][iCol][iRow]+1;
}
}else{
cout<<"Warning: impossible Pad numbers: row: "
<<iRow<<" col: "<<iCol<<" charge: "<<fCharge<<endl;
}
}
}
if (kData) nCounter++;
}
void HRichReCalibrater::initializeMeanSigma(){
for(Int_t i=0; i<sectorMax; i++){
for(Int_t j=0; j<colMax; j++){
for(Int_t k=0; k<rowMax; k++){
pDiff[i][j][k] = 0.;
pMean[i][j][k] = 0.;
pSigma[i][j][k] = 0.;
}
}
}
}
void HRichReCalibrater::meanAndSigma(Int_t sIx, Int_t col, Int_t row, Float_t charge){
Double_t nEv = (double)countArray[sIx][col][row];
Double_t sigma = sqrt(pSigma[sIx][col][row]*nEv);
if( nEv>5. && fabs(pMean[sIx][col][row] - charge) >= size * sigma + epsilon && fabs(pMean[sIx][col][row] - charge) > channels ){
pRunAway[sIx][col][row]++;
countArray[sIx][col][row]--;
}
else{
pDiff[sIx][col][row] = ((double)charge - pMean[sIx][col][row]) / (nEv+1.);
pMean[sIx][col][row] = pMean[sIx][col][row] + pDiff[sIx][col][row];
pSigma[sIx][col][row] = (nEv==0.)?0.:((nEv-1.)/(nEv+1.))*pSigma[sIx][col][row]+pDiff[sIx][col][row]*pDiff[sIx][col][row];
}
}
void HRichReCalibrater::bookCounterHisto(){
count = new TH1F("count","count",3,0,3);
}
void HRichReCalibrater::fillCounterHisto(){
count->Fill(1,nCounter+1);
}
void HRichReCalibrater::outputFile(){
Char_t fileName[128];
const Char_t * extRoot = ".root";
strcpy(fileName,pedPathName.Data());
strcat(fileName,extRoot);
dataFile = new TFile(fileName, "RECREATE");
count->Write();
for (Int_t i = 0; i<sectorMax; i++){
if (mask[i][0] == 1){
meanHisto[i]->Write();
mean1dHisto[i]->Write();
sigmaHisto[i]->Write();
sigma1dHisto[i]->Write();
statHisto[i]->Write();
runAwayHisto[i]->Write();
}
}
dataFile->Close();
cout<<"Histos are written to: "<<fileName<<endl;
}
Bool_t HRichReCalibrater::init() {
if (checkInput){
fillMask();
bookHistos();
bookCounterHisto();
HRichDetector *pRichDet =
(HRichDetector*)gHades->getSetup()->getDetector("Rich");
pRichCal=gHades->getCurrentEvent()->getCategory(catRichCal);
if (!pRichCal) {
pRichCal=pRichDet->buildCategory(catRichCal);
if (!pRichCal) return kFALSE;
else gHades->getCurrentEvent()
->addCategory(catRichCal, pRichCal, "Rich");
}
pIter = (HMatrixCatIter*)pRichCal->MakeIterator();
uipFile();
nCounter = 0;
}
return kTRUE;
}
Int_t HRichReCalibrater::execute() {
if (checkInput){
calculate();
}
return kTRUE;
}
Bool_t HRichReCalibrater::finalize(void) {
if (checkInput){
cout<<"We are in finalize!"<<endl;
fill2DHistos();
if (sigmaTransformation){
fill1DHistos();
fillCounterHisto();
outputFile();
}
}
return kTRUE;
}
Last change: Sat May 22 13:09:56 2010
Last generated: 2010-05-22 13:09
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.