ROOT logo
//*-- Author   : Pablo Cabanelas
//*-- Created  : 24/08/07

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
//
//  HRpcCalibrater: perform global correction on the data
//
// Calibrates RpcRaw data and writes to RpcCal.
//
////////////////////////////////////////////////////////////////

using namespace std;
#include "hrpcdetector.h"
#include "hrpccalibrater.h"
#include "rpcdef.h"
#include "hrpcraw.h"
#include "hrpccal.h"
#include "hrpccalpar.h"
#include "hrpcchargeoffsetpar.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hevent.h"
#include "hcategory.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>


HRpcCalibrater::HRpcCalibrater(void)
{
  pRawCat=NULL;
  pCalCat=NULL;
  iter=NULL;
  pCalPar=NULL;
  pChOffPar=NULL;
}

HRpcCalibrater::HRpcCalibrater(const Text_t *name,const Text_t *title) :
  HReconstructor(name,title)
{
  pRawCat=NULL;
  pCalCat=NULL;
  iter=NULL;
  pCalPar=NULL;
  pChOffPar=NULL;
}

HRpcCalibrater::~HRpcCalibrater(void)
{
  if (iter) delete iter;
  iter=NULL;
}

Bool_t HRpcCalibrater::init(void)
{
  HRpcDetector *rpc;
  rpc=(HRpcDetector *)gHades->getSetup()->getDetector("Rpc");

  if(!rpc){
    Error("init","No Rpc Detector found");
    return kFALSE;
  }

  // Categories
  pRawCat=gHades->getCurrentEvent()->getCategory(catRpcRaw);
  if (!pRawCat) {
    Error("init","No RpcRaw Category");
    return kFALSE;
  }
  pCalCat=gHades->getCurrentEvent()->getCategory(catRpcCal);
  if (!pCalCat) {
    pCalCat=gHades->getSetup()->getDetector("Rpc")->buildCategory(catRpcCal);
    if (!pCalCat) return kFALSE;
    else gHades->getCurrentEvent()->addCategory(catRpcCal,pCalCat,"Rpc");
  }

  // Parameters
  pCalPar=(HRpcCalPar*)(gHades->getRuntimeDb()->getContainer("RpcCalPar"));
  if (!pCalPar){
    Error("init","No RpcCalPar Parameters");
    return kFALSE;
  }
  pChOffPar = (HRpcChargeOffsetPar*)(gHades->getRuntimeDb()->getContainer("RpcChargeOffsetPar"));
  if (!pChOffPar){
    Error("init","No RpcChargeOffsetPar Parameters");
    return kFALSE;
  }

  iter=(HIterator *)pRawCat->MakeIterator();
  loc.set(3,0,0,0);
  fActive=kTRUE;

  return kTRUE;
}

Int_t HRpcCalibrater::execute(void)
{

    HRpcCal *pCal=0;
    HRpcRaw *pRaw=0;


    // Do the calibration here and fill RpcCal category
    iter->Reset();
    while ( (pRaw=(HRpcRaw *)iter->Next()) != NULL) {

	loc[0] = pRaw->getSector();
	loc[1] = pRaw->getColumn();
	loc[2] = pRaw->getCell();

	if(loc[2]>31) continue; //FIXME: 31 (number of cells, must be hardcoded)
	//Note: In raw, also spare TRB channels are stored, but here
	//only real cells are used

	// Calibrating and sending to hitlevel only good hits
	if(pRaw->getLeftTime()>0 && pRaw->getRightTime()>0 &&
	   pRaw->getRightTot()>0 && pRaw->getLeftTot()>0) {

	    // Decide if it is embedding mode or not! if it is embedding mode the HRpcCalSim must be used insted!

	    pCal=(HRpcCal*)pCalCat->getSlot(loc);
	    if (pCal) {

		pCal=new (pCal) HRpcCal;
		if ( !pCal ) return EXIT_FAILURE;

		// Filling address (sector, column and cell) and logBit to RpcCal category
		pCal->setAddress(pRaw->getAddress());
		pCal->setLogBit(pRaw->getRightLogBit()); //FIXME: Here this is just a convention

		// Getting calibration parameters from RpcCalPar container
		Float_t rightTimeOffset,leftTimeOffset,rightTotOffset,leftTotOffset,rightChargeTimeOff,leftChargeTimeOff,tdc2time,tot2charge,tzero=0.0;

		HRpcCalParCol* pCalParCol=pCalPar->getCol(loc[0],loc[1]);
		if(pCalParCol) {
		    HRpcCalParCell* pCalParCell=pCalParCol->getCell(loc[2]);
		    if(pCalParCell) {
			pCalParCell->getAddress(rightTimeOffset,leftTimeOffset,rightTotOffset,leftTotOffset,tdc2time,
						tot2charge,tzero);

			leftChargeTimeOff  = pChOffPar->getPar(loc[0], pRaw->getLeftTRBNum(), pRaw->getLeftMBONum(), pRaw->getLeftDBONum() );
			rightChargeTimeOff = pChOffPar->getPar(loc[0], pRaw->getRightTRBNum(), pRaw->getRightMBONum(), pRaw->getRightDBONum() );
			// Adding offsets and correcting units
			Float_t rightTime,leftTime;
			Float_t rightTot,leftTot,rightTot2,leftTot2;

			//FIXME: temporary.
			rightTime = (pRaw->getLeftTime()*tdc2time - pRaw->getRightTime()*tdc2time)/2 + rightTimeOffset;
			leftTime  = (pRaw->getLeftTime()*tdc2time + pRaw->getRightTime()*tdc2time)/2 + leftTimeOffset;

			rightTot  = (pRaw->getRightTot()*tdc2time-rightTotOffset-rightChargeTimeOff);
			leftTot   = (pRaw->getLeftTot()*tdc2time-leftTotOffset-leftChargeTimeOff);

			rightTot2 = (pRaw->getRightTotLast()*tdc2time-rightTotOffset-rightChargeTimeOff);
			leftTot2  = (pRaw->getLeftTotLast()*tdc2time-leftTotOffset-leftChargeTimeOff);

			// Setting values to the RpcCal category
			pCal->setRightTime(rightTime);
			pCal->setLeftTime(leftTime);

			pCal->setRightCharge(rightTot);
			pCal->setRightCharge2(rightTot2);
			pCal->setLeftCharge(leftTot);
			pCal->setLeftCharge2(leftTot2);
			//By default it stores the TotLast as the second charge: Charge2

		    } else { Warning("execute","Can't get CalParCell = %i!",loc[2]); }
		} else { Warning("execute","Can't get CalParCol = %i %i!",loc[0],loc[1]); }

	    } else {
		Error ("execute()", "Can't get slot in calibrater: sec %i, col %i, cell %i",loc[0],loc[1],loc[2]);
		return -1;
	    }
	}
    }
    return EXIT_SUCCESS;
}

ClassImp(HRpcCalibrater)
 hrpccalibrater.cc:1
 hrpccalibrater.cc:2
 hrpccalibrater.cc:3
 hrpccalibrater.cc:4
 hrpccalibrater.cc:5
 hrpccalibrater.cc:6
 hrpccalibrater.cc:7
 hrpccalibrater.cc:8
 hrpccalibrater.cc:9
 hrpccalibrater.cc:10
 hrpccalibrater.cc:11
 hrpccalibrater.cc:12
 hrpccalibrater.cc:13
 hrpccalibrater.cc:14
 hrpccalibrater.cc:15
 hrpccalibrater.cc:16
 hrpccalibrater.cc:17
 hrpccalibrater.cc:18
 hrpccalibrater.cc:19
 hrpccalibrater.cc:20
 hrpccalibrater.cc:21
 hrpccalibrater.cc:22
 hrpccalibrater.cc:23
 hrpccalibrater.cc:24
 hrpccalibrater.cc:25
 hrpccalibrater.cc:26
 hrpccalibrater.cc:27
 hrpccalibrater.cc:28
 hrpccalibrater.cc:29
 hrpccalibrater.cc:30
 hrpccalibrater.cc:31
 hrpccalibrater.cc:32
 hrpccalibrater.cc:33
 hrpccalibrater.cc:34
 hrpccalibrater.cc:35
 hrpccalibrater.cc:36
 hrpccalibrater.cc:37
 hrpccalibrater.cc:38
 hrpccalibrater.cc:39
 hrpccalibrater.cc:40
 hrpccalibrater.cc:41
 hrpccalibrater.cc:42
 hrpccalibrater.cc:43
 hrpccalibrater.cc:44
 hrpccalibrater.cc:45
 hrpccalibrater.cc:46
 hrpccalibrater.cc:47
 hrpccalibrater.cc:48
 hrpccalibrater.cc:49
 hrpccalibrater.cc:50
 hrpccalibrater.cc:51
 hrpccalibrater.cc:52
 hrpccalibrater.cc:53
 hrpccalibrater.cc:54
 hrpccalibrater.cc:55
 hrpccalibrater.cc:56
 hrpccalibrater.cc:57
 hrpccalibrater.cc:58
 hrpccalibrater.cc:59
 hrpccalibrater.cc:60
 hrpccalibrater.cc:61
 hrpccalibrater.cc:62
 hrpccalibrater.cc:63
 hrpccalibrater.cc:64
 hrpccalibrater.cc:65
 hrpccalibrater.cc:66
 hrpccalibrater.cc:67
 hrpccalibrater.cc:68
 hrpccalibrater.cc:69
 hrpccalibrater.cc:70
 hrpccalibrater.cc:71
 hrpccalibrater.cc:72
 hrpccalibrater.cc:73
 hrpccalibrater.cc:74
 hrpccalibrater.cc:75
 hrpccalibrater.cc:76
 hrpccalibrater.cc:77
 hrpccalibrater.cc:78
 hrpccalibrater.cc:79
 hrpccalibrater.cc:80
 hrpccalibrater.cc:81
 hrpccalibrater.cc:82
 hrpccalibrater.cc:83
 hrpccalibrater.cc:84
 hrpccalibrater.cc:85
 hrpccalibrater.cc:86
 hrpccalibrater.cc:87
 hrpccalibrater.cc:88
 hrpccalibrater.cc:89
 hrpccalibrater.cc:90
 hrpccalibrater.cc:91
 hrpccalibrater.cc:92
 hrpccalibrater.cc:93
 hrpccalibrater.cc:94
 hrpccalibrater.cc:95
 hrpccalibrater.cc:96
 hrpccalibrater.cc:97
 hrpccalibrater.cc:98
 hrpccalibrater.cc:99
 hrpccalibrater.cc:100
 hrpccalibrater.cc:101
 hrpccalibrater.cc:102
 hrpccalibrater.cc:103
 hrpccalibrater.cc:104
 hrpccalibrater.cc:105
 hrpccalibrater.cc:106
 hrpccalibrater.cc:107
 hrpccalibrater.cc:108
 hrpccalibrater.cc:109
 hrpccalibrater.cc:110
 hrpccalibrater.cc:111
 hrpccalibrater.cc:112
 hrpccalibrater.cc:113
 hrpccalibrater.cc:114
 hrpccalibrater.cc:115
 hrpccalibrater.cc:116
 hrpccalibrater.cc:117
 hrpccalibrater.cc:118
 hrpccalibrater.cc:119
 hrpccalibrater.cc:120
 hrpccalibrater.cc:121
 hrpccalibrater.cc:122
 hrpccalibrater.cc:123
 hrpccalibrater.cc:124
 hrpccalibrater.cc:125
 hrpccalibrater.cc:126
 hrpccalibrater.cc:127
 hrpccalibrater.cc:128
 hrpccalibrater.cc:129
 hrpccalibrater.cc:130
 hrpccalibrater.cc:131
 hrpccalibrater.cc:132
 hrpccalibrater.cc:133
 hrpccalibrater.cc:134
 hrpccalibrater.cc:135
 hrpccalibrater.cc:136
 hrpccalibrater.cc:137
 hrpccalibrater.cc:138
 hrpccalibrater.cc:139
 hrpccalibrater.cc:140
 hrpccalibrater.cc:141
 hrpccalibrater.cc:142
 hrpccalibrater.cc:143
 hrpccalibrater.cc:144
 hrpccalibrater.cc:145
 hrpccalibrater.cc:146
 hrpccalibrater.cc:147
 hrpccalibrater.cc:148
 hrpccalibrater.cc:149
 hrpccalibrater.cc:150
 hrpccalibrater.cc:151
 hrpccalibrater.cc:152
 hrpccalibrater.cc:153
 hrpccalibrater.cc:154
 hrpccalibrater.cc:155
 hrpccalibrater.cc:156
 hrpccalibrater.cc:157
 hrpccalibrater.cc:158
 hrpccalibrater.cc:159
 hrpccalibrater.cc:160
 hrpccalibrater.cc:161
 hrpccalibrater.cc:162
 hrpccalibrater.cc:163
 hrpccalibrater.cc:164
 hrpccalibrater.cc:165
 hrpccalibrater.cc:166
 hrpccalibrater.cc:167
 hrpccalibrater.cc:168
 hrpccalibrater.cc:169
 hrpccalibrater.cc:170
 hrpccalibrater.cc:171
 hrpccalibrater.cc:172
 hrpccalibrater.cc:173
 hrpccalibrater.cc:174
 hrpccalibrater.cc:175
 hrpccalibrater.cc:176
 hrpccalibrater.cc:177
 hrpccalibrater.cc:178
 hrpccalibrater.cc:179
 hrpccalibrater.cc:180
 hrpccalibrater.cc:181
 hrpccalibrater.cc:182
 hrpccalibrater.cc:183
 hrpccalibrater.cc:184