ROOT logo
//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////
//
//  HPionTrackerCalibrater:
//
//  Calibrates all fired cells in PionTrackerRaw category and fills
//  the PionTrackerCal category
//
////////////////////////////////////////////////////////////////

#include "hpiontrackercalibrater.h"
#include "hpiontrackerdef.h"
#include "hpiontrackerraw.h"
#include "hpiontrackercal.h"
#include "hpiontrackerdetector.h"
#include "hpiontrackercalpar.h"
#include "hpiontrackerhitfpar.h"
#include "hades.h"
#include "hcategory.h"
#include "hdebug.h"
#include "hevent.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hrun.h"
#include "hspectrometer.h"

#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

#define PR(x) std::cout << "++DEBUG: " << #x << " = |" << x << "| (" << __FILE__ << ", " << __LINE__ << ")\n";
#define PRh(x) std::cout << "++DEBUG: " << #x << " = hex |" << std::hex << x << std::dec << "| (" << __FILE__ << ", " << __LINE__ << ")\n";

/*ClassImp(HPionTrackerCalibrater)
HPionTrackerCalibrater::HPionTrackerCalibrater(void)
{
	// default constructor
	pRawCat = NULL;
	pCalCat = NULL;
	iter   = NULL;
	pCalpar = NULL;
}

HPionTrackerCalibrater::HPionTrackerCalibrater(const Text_t *name, const Text_t *title) : HReconstructor(name, title)
{
	// constructor
	pRawCat = NULL;
	pCalCat = NULL;
	iter   = NULL;
	pCalpar = NULL;
}*/

// raw category, cal category, iterator, cal parameter, run_id
ClassImp(HPionTrackerCalibrater)
HPionTrackerCalibrater::HPionTrackerCalibrater(void) :
	pRawCat(NULL), pCalCat(NULL), iter(NULL), pCalpar(NULL), pRunpar(NULL)
{
	// default constructor
	correction.clear();
	memset(corrs, 0, 4 * sizeof(Double_t));
}

HPionTrackerCalibrater::HPionTrackerCalibrater(const Text_t *name, const Text_t *title) : HReconstructor(name, title),
	pRawCat(NULL), pCalCat(NULL), iter(NULL), pCalpar(NULL), pRunpar(NULL)
{
	// constructor
	correction.clear();
	memset(corrs, 0, 4 * sizeof(Double_t));
}

HPionTrackerCalibrater::~HPionTrackerCalibrater(void)
{
	//destructor deletes the iterator on the raw category
	if (NULL != iter)
	{
		delete iter;
		iter = NULL;
	}
}

Bool_t HPionTrackerCalibrater::init(void)
{
	// gets the calibration parameter container
        // gets the run_id (for calibration)
       	// gets the PionTrackerRaw category
        // creates the PionTrackerCal category
	// creates an iterator which loops over all fired cells in PionTrackerRaw
	HPionTrackerDetector* det = (HPionTrackerDetector*)gHades->getSetup()->getDetector("PionTracker");
	if (!det)
	{
		Error("init", "No PionTracker found.");
		return kFALSE;
	}

	pCalpar = (HPionTrackerCalPar*)gHades->getRuntimeDb()->getContainer("PionTrackerCalPar");
	if (!pCalpar) return kFALSE;

	pHitfpar = (HPionTrackerHitFPar*)gHades->getRuntimeDb()->getContainer("PionTrackerHitFPar");
	if (!pHitfpar) return kFALSE;

       	pRunpar = (HPionTrackerCalRunPar*)gHades->getRuntimeDb()->getContainer("PionTrackerCalRunPar");
	if (!pRunpar) return kFALSE;

	pRawCat = gHades->getCurrentEvent()->getCategory(catPionTrackerRaw);
	if (!pRawCat)
	{
		Error("init()", "HPionTrackerRaw category not available!");
		return kFALSE;
	}

	pCalCat = det->buildCategory(catPionTrackerCal);
	if (!pCalCat) return kFALSE;

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

	return kTRUE;
}

Bool_t HPionTrackerCalibrater::reinit(void)
{
	// gets the calibration parameter container
//	if(doCorrection)
	{
		memset(corrs,0, 4*sizeof(Double_t));

		if (!pRunpar) return kFALSE;

		Int_t runID = gHades->getRuntimeDb()->getCurrentRun()->getRunId();
		correction.clear();
		pRunpar->getRun(runID, &correction);
		for (Int_t i=0 ; i < correction.getNVals() ; ++i)
		{
			corrs[i] = correction.getVal(i);
		}
	}
	return kTRUE;
}

Int_t HPionTrackerCalibrater::execute(void)
{ 
	// calibrates all fired cells [strip,module]
	HPionTrackerRaw *pRaw = NULL;
	HPionTrackerCal *pCal = NULL;

	Int_t mod	= 0;
	Int_t strip	= 0;
	Int_t nhits	= 0;

	Float_t rawTime		= 0.F;
	Float_t rawCharge	= 0.F;
	Float_t calTime		= 0.F;
	Float_t calCharge	= 0.F;
	Char_t pileup		= 0;
	Char_t overflow		= 0;

	Float_t parCellData[4] = {1.F, 0.F, 1.F, 0.F}; //cal array: cal paramters

	//	cout << "New event\n";
	//Fill cal category
	iter->Reset();
	while ((pRaw = (HPionTrackerRaw *)iter->Next()) != 0) //interation over fired cells
	{
	  //cout << "*****************\n";
		pRaw->getAddress(mod, strip);
		loc[0] = mod;
		loc[1] = strip;
		//cout << "Mod: " << mod << endl;
		if (mod >= 0)
		{
			pCal = (HPionTrackerCal*)pCalCat->getObject(loc);
			if (!pCal) // should be no object under location loc yet
			{
				pCal = (HPionTrackerCal *)pCalCat->getSlot(loc);
				if (pCal) // there should be space reserved for the slot
				{
					pCal = new(pCal) HPionTrackerCal;
					pCal->setAddress(loc[0], loc[1]);
				}
				else
				{
					Error("execute()", "Can't get slot mod=%i, strip=%i", mod, strip);
					return -1;
				}
			}
			else
			{
				Error("execute()", "Slot already exists for mod=%i, strip=%i", mod, strip);
				return -1;
				
			}
	    
			// get the calibration parameters for module, strip
			// from parameters
			HPionTrackerCalParCell &pPar = (*pCalpar)[mod][strip];
			pPar.getData(parCellData);

			// get hitf parameter for adc offset due to temperature drift if pt file has some timeoffset
			charge_offset[mod] = pHitfpar->getClusterThresh(mod);
			// get hitf parameter to switch of the usage of the ADC value
			calib_charge[mod] =  pHitfpar->getClusterDistX(mod);
			

			// loop over number of hits, still in while, mod & strip already selected
			nhits = pRaw->getMultiplicity();
			for (Int_t i = 0; i < nhits; ++i) 
			{
				// get data from raw category
				pRaw->getTimeAndCharge(i, rawTime, rawCharge);
				pRaw->getErrors(i, pileup, overflow);

				// correct the time and width
				calTime   = parCellData[0] * rawTime + parCellData[1];

				//hack for invalid adc data used by Aug14 data
				// this version no adc data used for mod0 and mod1 in Aug14
				//	if (rawCharge == 0 or corrs[mod] == 1659 or corrs[mod] == 1491) 
				if (calib_charge[mod] == 0)
				  {
				    calCharge = HPionTrackerCal::InvalidAdc();}
				else
				  {
				    calCharge = -parCellData[2] * rawCharge + parCellData[3] - corrs[mod] - charge_offset[mod];

				  }
				//calCharge = -parCellData[2] * rawCharge + parCellData[3];
// 				calCharge = (parCellData[3] - rawCharge) * parCellData[2];

				// set calibrated data
				/*cout << "calTime:" << calTime <<endl;
				cout << "calCharge: " << calCharge << endl;
				cout << corrs[mod] << endl;
				cout << strip << endl;
				cout << nhits << endl;*/
				pCal->setData(calTime, calCharge, pileup, overflow);
			}
		}
	}
	//cout << "End event\n";
	return 0;
}
 hpiontrackercalibrater.cc:1
 hpiontrackercalibrater.cc:2
 hpiontrackercalibrater.cc:3
 hpiontrackercalibrater.cc:4
 hpiontrackercalibrater.cc:5
 hpiontrackercalibrater.cc:6
 hpiontrackercalibrater.cc:7
 hpiontrackercalibrater.cc:8
 hpiontrackercalibrater.cc:9
 hpiontrackercalibrater.cc:10
 hpiontrackercalibrater.cc:11
 hpiontrackercalibrater.cc:12
 hpiontrackercalibrater.cc:13
 hpiontrackercalibrater.cc:14
 hpiontrackercalibrater.cc:15
 hpiontrackercalibrater.cc:16
 hpiontrackercalibrater.cc:17
 hpiontrackercalibrater.cc:18
 hpiontrackercalibrater.cc:19
 hpiontrackercalibrater.cc:20
 hpiontrackercalibrater.cc:21
 hpiontrackercalibrater.cc:22
 hpiontrackercalibrater.cc:23
 hpiontrackercalibrater.cc:24
 hpiontrackercalibrater.cc:25
 hpiontrackercalibrater.cc:26
 hpiontrackercalibrater.cc:27
 hpiontrackercalibrater.cc:28
 hpiontrackercalibrater.cc:29
 hpiontrackercalibrater.cc:30
 hpiontrackercalibrater.cc:31
 hpiontrackercalibrater.cc:32
 hpiontrackercalibrater.cc:33
 hpiontrackercalibrater.cc:34
 hpiontrackercalibrater.cc:35
 hpiontrackercalibrater.cc:36
 hpiontrackercalibrater.cc:37
 hpiontrackercalibrater.cc:38
 hpiontrackercalibrater.cc:39
 hpiontrackercalibrater.cc:40
 hpiontrackercalibrater.cc:41
 hpiontrackercalibrater.cc:42
 hpiontrackercalibrater.cc:43
 hpiontrackercalibrater.cc:44
 hpiontrackercalibrater.cc:45
 hpiontrackercalibrater.cc:46
 hpiontrackercalibrater.cc:47
 hpiontrackercalibrater.cc:48
 hpiontrackercalibrater.cc:49
 hpiontrackercalibrater.cc:50
 hpiontrackercalibrater.cc:51
 hpiontrackercalibrater.cc:52
 hpiontrackercalibrater.cc:53
 hpiontrackercalibrater.cc:54
 hpiontrackercalibrater.cc:55
 hpiontrackercalibrater.cc:56
 hpiontrackercalibrater.cc:57
 hpiontrackercalibrater.cc:58
 hpiontrackercalibrater.cc:59
 hpiontrackercalibrater.cc:60
 hpiontrackercalibrater.cc:61
 hpiontrackercalibrater.cc:62
 hpiontrackercalibrater.cc:63
 hpiontrackercalibrater.cc:64
 hpiontrackercalibrater.cc:65
 hpiontrackercalibrater.cc:66
 hpiontrackercalibrater.cc:67
 hpiontrackercalibrater.cc:68
 hpiontrackercalibrater.cc:69
 hpiontrackercalibrater.cc:70
 hpiontrackercalibrater.cc:71
 hpiontrackercalibrater.cc:72
 hpiontrackercalibrater.cc:73
 hpiontrackercalibrater.cc:74
 hpiontrackercalibrater.cc:75
 hpiontrackercalibrater.cc:76
 hpiontrackercalibrater.cc:77
 hpiontrackercalibrater.cc:78
 hpiontrackercalibrater.cc:79
 hpiontrackercalibrater.cc:80
 hpiontrackercalibrater.cc:81
 hpiontrackercalibrater.cc:82
 hpiontrackercalibrater.cc:83
 hpiontrackercalibrater.cc:84
 hpiontrackercalibrater.cc:85
 hpiontrackercalibrater.cc:86
 hpiontrackercalibrater.cc:87
 hpiontrackercalibrater.cc:88
 hpiontrackercalibrater.cc:89
 hpiontrackercalibrater.cc:90
 hpiontrackercalibrater.cc:91
 hpiontrackercalibrater.cc:92
 hpiontrackercalibrater.cc:93
 hpiontrackercalibrater.cc:94
 hpiontrackercalibrater.cc:95
 hpiontrackercalibrater.cc:96
 hpiontrackercalibrater.cc:97
 hpiontrackercalibrater.cc:98
 hpiontrackercalibrater.cc:99
 hpiontrackercalibrater.cc:100
 hpiontrackercalibrater.cc:101
 hpiontrackercalibrater.cc:102
 hpiontrackercalibrater.cc:103
 hpiontrackercalibrater.cc:104
 hpiontrackercalibrater.cc:105
 hpiontrackercalibrater.cc:106
 hpiontrackercalibrater.cc:107
 hpiontrackercalibrater.cc:108
 hpiontrackercalibrater.cc:109
 hpiontrackercalibrater.cc:110
 hpiontrackercalibrater.cc:111
 hpiontrackercalibrater.cc:112
 hpiontrackercalibrater.cc:113
 hpiontrackercalibrater.cc:114
 hpiontrackercalibrater.cc:115
 hpiontrackercalibrater.cc:116
 hpiontrackercalibrater.cc:117
 hpiontrackercalibrater.cc:118
 hpiontrackercalibrater.cc:119
 hpiontrackercalibrater.cc:120
 hpiontrackercalibrater.cc:121
 hpiontrackercalibrater.cc:122
 hpiontrackercalibrater.cc:123
 hpiontrackercalibrater.cc:124
 hpiontrackercalibrater.cc:125
 hpiontrackercalibrater.cc:126
 hpiontrackercalibrater.cc:127
 hpiontrackercalibrater.cc:128
 hpiontrackercalibrater.cc:129
 hpiontrackercalibrater.cc:130
 hpiontrackercalibrater.cc:131
 hpiontrackercalibrater.cc:132
 hpiontrackercalibrater.cc:133
 hpiontrackercalibrater.cc:134
 hpiontrackercalibrater.cc:135
 hpiontrackercalibrater.cc:136
 hpiontrackercalibrater.cc:137
 hpiontrackercalibrater.cc:138
 hpiontrackercalibrater.cc:139
 hpiontrackercalibrater.cc:140
 hpiontrackercalibrater.cc:141
 hpiontrackercalibrater.cc:142
 hpiontrackercalibrater.cc:143
 hpiontrackercalibrater.cc:144
 hpiontrackercalibrater.cc:145
 hpiontrackercalibrater.cc:146
 hpiontrackercalibrater.cc:147
 hpiontrackercalibrater.cc:148
 hpiontrackercalibrater.cc:149
 hpiontrackercalibrater.cc:150
 hpiontrackercalibrater.cc:151
 hpiontrackercalibrater.cc:152
 hpiontrackercalibrater.cc:153
 hpiontrackercalibrater.cc:154
 hpiontrackercalibrater.cc:155
 hpiontrackercalibrater.cc:156
 hpiontrackercalibrater.cc:157
 hpiontrackercalibrater.cc:158
 hpiontrackercalibrater.cc:159
 hpiontrackercalibrater.cc:160
 hpiontrackercalibrater.cc:161
 hpiontrackercalibrater.cc:162
 hpiontrackercalibrater.cc:163
 hpiontrackercalibrater.cc:164
 hpiontrackercalibrater.cc:165
 hpiontrackercalibrater.cc:166
 hpiontrackercalibrater.cc:167
 hpiontrackercalibrater.cc:168
 hpiontrackercalibrater.cc:169
 hpiontrackercalibrater.cc:170
 hpiontrackercalibrater.cc:171
 hpiontrackercalibrater.cc:172
 hpiontrackercalibrater.cc:173
 hpiontrackercalibrater.cc:174
 hpiontrackercalibrater.cc:175
 hpiontrackercalibrater.cc:176
 hpiontrackercalibrater.cc:177
 hpiontrackercalibrater.cc:178
 hpiontrackercalibrater.cc:179
 hpiontrackercalibrater.cc:180
 hpiontrackercalibrater.cc:181
 hpiontrackercalibrater.cc:182
 hpiontrackercalibrater.cc:183
 hpiontrackercalibrater.cc:184
 hpiontrackercalibrater.cc:185
 hpiontrackercalibrater.cc:186
 hpiontrackercalibrater.cc:187
 hpiontrackercalibrater.cc:188
 hpiontrackercalibrater.cc:189
 hpiontrackercalibrater.cc:190
 hpiontrackercalibrater.cc:191
 hpiontrackercalibrater.cc:192
 hpiontrackercalibrater.cc:193
 hpiontrackercalibrater.cc:194
 hpiontrackercalibrater.cc:195
 hpiontrackercalibrater.cc:196
 hpiontrackercalibrater.cc:197
 hpiontrackercalibrater.cc:198
 hpiontrackercalibrater.cc:199
 hpiontrackercalibrater.cc:200
 hpiontrackercalibrater.cc:201
 hpiontrackercalibrater.cc:202
 hpiontrackercalibrater.cc:203
 hpiontrackercalibrater.cc:204
 hpiontrackercalibrater.cc:205
 hpiontrackercalibrater.cc:206
 hpiontrackercalibrater.cc:207
 hpiontrackercalibrater.cc:208
 hpiontrackercalibrater.cc:209
 hpiontrackercalibrater.cc:210
 hpiontrackercalibrater.cc:211
 hpiontrackercalibrater.cc:212
 hpiontrackercalibrater.cc:213
 hpiontrackercalibrater.cc:214
 hpiontrackercalibrater.cc:215
 hpiontrackercalibrater.cc:216
 hpiontrackercalibrater.cc:217
 hpiontrackercalibrater.cc:218
 hpiontrackercalibrater.cc:219
 hpiontrackercalibrater.cc:220
 hpiontrackercalibrater.cc:221
 hpiontrackercalibrater.cc:222
 hpiontrackercalibrater.cc:223
 hpiontrackercalibrater.cc:224
 hpiontrackercalibrater.cc:225
 hpiontrackercalibrater.cc:226
 hpiontrackercalibrater.cc:227
 hpiontrackercalibrater.cc:228
 hpiontrackercalibrater.cc:229
 hpiontrackercalibrater.cc:230
 hpiontrackercalibrater.cc:231
 hpiontrackercalibrater.cc:232
 hpiontrackercalibrater.cc:233
 hpiontrackercalibrater.cc:234
 hpiontrackercalibrater.cc:235
 hpiontrackercalibrater.cc:236
 hpiontrackercalibrater.cc:237
 hpiontrackercalibrater.cc:238
 hpiontrackercalibrater.cc:239
 hpiontrackercalibrater.cc:240
 hpiontrackercalibrater.cc:241
 hpiontrackercalibrater.cc:242
 hpiontrackercalibrater.cc:243
 hpiontrackercalibrater.cc:244