#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) :
	pRawCat(NULL), pCalCat(NULL), iter(NULL), pCalpar(NULL), pRunpar(NULL)
{
	
	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)
{
	
	correction.clear();
	memset(corrs, 0, 4 * sizeof(Double_t));
}
HPionTrackerCalibrater::~HPionTrackerCalibrater(void)
{
	
	if (NULL != iter)
	{
		delete iter;
		iter = NULL;
	}
}
Bool_t HPionTrackerCalibrater::init(void)
{
	
        
       	
        
	
	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)
{
	
	{
		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)
{ 
	
	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}; 
	
	
	iter->Reset();
	while ((pRaw = (HPionTrackerRaw *)iter->Next()) != 0) 
	{
	  
		pRaw->getAddress(mod, strip);
		loc[0] = mod;
		loc[1] = strip;
		
		if (mod >= 0)
		{
			pCal = (HPionTrackerCal*)pCalCat->getObject(loc);
			if (!pCal) 
			{
				pCal = (HPionTrackerCal *)pCalCat->getSlot(loc);
				if (pCal) 
				{
					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;
				
			}
	    
			
			
			HPionTrackerCalParCell &pPar = (*pCalpar)[mod][strip];
			pPar.getData(parCellData);
			
			charge_offset[mod] = pHitfpar->getClusterThresh(mod);
			
			calib_charge[mod] =  pHitfpar->getClusterDistX(mod);
			
			
			nhits = pRaw->getMultiplicity();
			for (Int_t i = 0; i < nhits; ++i) 
			{
				
				pRaw->getTimeAndCharge(i, rawTime, rawCharge);
				pRaw->getErrors(i, pileup, overflow);
				
				calTime   = parCellData[0] * rawTime + parCellData[1];
				
				
				
				if (calib_charge[mod] == 0)
				  {
				    calCharge = HPionTrackerCal::InvalidAdc();}
				else
				  {
				    calCharge = -parCellData[2] * rawCharge + parCellData[3] - corrs[mod] - charge_offset[mod];
				  }
				
				
				
				pCal->setData(calTime, calCharge, pileup, overflow);
			}
		}
	}
	
	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