ROOT logo
using namespace std;
#include "TRandom.h"
#include <time.h>
#include "hwalldigitizer.h"
#include "walldef.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hwalldetector.h"
#include "hwalldigipar.h"
#include "hwallgeompar.h"
#include "hgeantwall.h"
#include "hwallrawsim.h"
#include "hevent.h"
#include "hcategory.h"
#include "hlocation.h"
#include "hwallrawsimfilter.h"
#include <iostream> 
#include <iomanip>

//*-- Author : D.Vasiliev
//*-- Modified: 07/04/2005 F.Krizek
//*-- Modified: 27/10/2002 D.Zovinec
//*-- Modified: 13/02/2002 by D.Zovinec
//*-- Modified: 30/11/2000 by R.Holzmann
//*-- Modified: 16/12/99 by J.Bielcik
//*-- Modified: 9/12/99 by V.Charriere
//*-- Modified: 8/11/99 by R.Holzmann
//*-- Modified: 24/10/99 by D.Vasiliev
// Modified by M.Golubeva 01.11.2006

//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////////////
//
//  HTofDigitizer digitizes data, puts output values into
//  raw data category
//
//  Need to implement quenching?
//
/////////////////////////////////////////////////////////////////////

void HWallDigitizer::initParContainer() {

    pWallDigiPar=(HWallDigiPar *)gHades->getRuntimeDb()->getContainer("WallDigiPar");
}

HWallDigitizer::HWallDigitizer(void) {

    fGeantCat    = 0;
    fRawCat      = 0;
    pWallDigiPar = 0;
    pWallGeomPar = 0;
    fLoc.set(1,0);
    iterGeant    = 0;
    iterWallRaw  = 0;
}

HWallDigitizer::HWallDigitizer(const Text_t *name,const Text_t *title) :
HReconstructor(name,title) {

    fGeantCat    = 0;
    fRawCat      = 0;
    pWallDigiPar = 0;
    pWallGeomPar = 0;
    fLoc.set(1,0);
    iterGeant    = 0;
    iterWallRaw  = 0;
}

HWallDigitizer::~HWallDigitizer(void) {
}

Bool_t HWallDigitizer::init(void) {

    time_t curtime;

    fGeantCat = gHades->getCurrentEvent()->getCategory(catWallGeantRaw);
    if (!fGeantCat) {
        Warning("init()","No category catWallGeantRaw found!") ;
    } else iterGeant   = (HIterator *)fGeantCat->MakeIterator("native");

    fRawCat = gHades->getCurrentEvent()->getCategory(catWallRaw);
    if (!fRawCat) {
	HWallDetector* wall=(HWallDetector*)(gHades->getSetup()->getDetector("Wall"));
	if(wall){
	    fRawCat=wall->buildMatrixCategory("HWallRawSim",0.5F);
	    if (fRawCat) gHades->getCurrentEvent()->addCategory(catWallRaw,fRawCat,"Wall");
	}
    }

    
    if(fRawCat) iterWallRaw = (HIterator *)fRawCat  ->MakeIterator("native");
    else        Warning("init()","No category catWallRaw !") ;


    if(fGeantCat&&fRawCat) initParContainer();


    time(&curtime);

    return kTRUE;
}

Int_t HWallDigitizer::execute(void) {

    if(!iterGeant || !iterWallRaw) return 0;

    const Float_t quantEff = 0.24;       // PMT quantum efficiency.
    const Float_t photYield = 11100.0;   // photon yield in scintillator (phot/MeV).
    const Float_t timeResWall[3] = {0.42, 0.52, 0.67};  //values based on apr07 analysis
    //{0.35, 0.42, 0.60};  // time resolution in the centres of the
    //                        small(40x40mm), middle (80x80mm) and
    //                        large (160x160mm) cells [ns].
    const Float_t relAmplResol   = 0.08; // sigma of Gaus distribution.
    const Float_t minEnerRelease = 1.8;  // minimum energy release (MeV/cm)

    HGeantWall* geant = 0;
    HWallRawSim* raw  = 0;
    HWallRawSimFilter fRawFilter;

    TString cellName,str;
    Float_t slopeTDC;
    Int_t thrCFD, thrADC;
    Int_t cell = -1;
    fLoc.set(1,-1);

    Int_t   numTrack, numTrack1 = -1, numTrack2 = -1;      //track numbers
    Float_t trackLen;
    Float_t time, charge;
    Int_t timeCh, chargeCh;
    Float_t prevTime, prevCharge;
    Float_t timeResol, amplResol, chargeRef;


    Float_t geaTof  = 0.;
    Float_t geaTof1[383];
    Float_t geaTof2[383];
    Float_t geaEner = 0.;
    Float_t geaX    = 0.;
    Float_t geaY    = 0.;     // used by Tofino only
    Float_t geaMom  = 0.;

    iterGeant->Reset();   // this works only in split mode=2
    // (for 0 and 1 the iterator must be recreated)

    while ((geant = (HGeantWall *)iterGeant->Next()) != 0) {

	fLoc[0] = geant->getCell();

	raw = (HWallRawSim*) fRawCat->getObject(fLoc);   // test if cell in use
	if(raw) {
	    raw->incNHit();  // increment counter for additional hits
	    numTrack1  = raw->getNTrack1();
	    numTrack2  = raw->getNTrack2();
	    prevTime   = raw->getTime();
	    prevCharge = raw->getCharge();
	}
	else {
	    prevTime   = 100000.;
	    prevCharge = 0.;
	    raw = (HWallRawSim*) fRawCat->getNewSlot(fLoc);  // get new slot
	    if(!raw) continue;
	    raw = new(raw) HWallRawSim;
	    raw->setNHit(1);
	}

	cell = fLoc[0];
	slopeTDC = pWallDigiPar->getTDC_Slope(cell);

	geant->getHit(geaEner,geaX,geaY,geaTof,geaMom,trackLen);

	numTrack = geant->getTrack();
	cellName = pWallGeomPar->getCellName(fLoc[0]);

	str=cellName.Replace(0,3,"",0);
	str.Replace(1,3,"",0);

	time = geaTof;

	timeResol = timeResWall[atoi(str)-1];
	time      = gRandom->Gaus(time,timeResol);


	timeCh = (Int_t) (time/slopeTDC);
	if (timeCh < 0)    timeCh = 0;
	if (timeCh > 4095) timeCh = 4095;
	time = ( Float_t ) (timeCh);

	if(raw->getNHit() > 1){
	    if(geaTof < geaTof1[fLoc[0]]){
		numTrack2 = numTrack1;
		numTrack1 = numTrack;
		geaTof2[fLoc[0]] = geaTof1[fLoc[0]];
		geaTof1[fLoc[0]] = geaTof;
	    } else {
		if(geaTof < geaTof2[fLoc[0]]){
		    numTrack2 = numTrack;
		    geaTof2[fLoc[0]] = geaTof;
		}
	    }
	}

	if(time > prevTime) time = prevTime;

	//charge = geaEner*photYield*quantEff*0.5*(1 - cos(ar*deg2rad))*exp(-(hl-geaX)/al);
	charge    = geaEner*photYield*quantEff;
	amplResol = charge*relAmplResol;
	charge    = gRandom->Gaus(charge,amplResol);

	chargeRef = photYield*quantEff*minEnerRelease;

	chargeCh = (Int_t) ((charge/chargeRef)*256. + prevCharge);
	if (chargeCh < 0) chargeCh = 0;
	if (chargeCh > 4095)  chargeCh = 4095;
	charge = (Float_t)chargeCh;


	raw->setTime(time);
	raw->setCharge(charge);
	raw->setCell((Int_t) fLoc[0]);
	if(raw->getNHit() > 1){
	    raw->setNTrack1(numTrack1);
	    raw->setNTrack2(numTrack2);
	} else {
	    raw->setNTrack1(numTrack);
	    raw->setNTrack2(-1);
	    geaTof1[fLoc[0]] = geaTof;
	    geaTof2[fLoc[0]] = 100000.;
	}
    }

    // Exclusion of hits with charge less than ADC threshold.
    // Time of hits with charge less than CFD threshold is set
    // to zero. These hits are excluded later in the hitfinder.

    iterWallRaw->Reset();
    while ( (raw = (HWallRawSim *)iterWallRaw->Next()) != NULL) {
	fLoc[0] = raw->getCell();
	time    = raw->getTime();
	charge  = raw->getCharge();


	// overflow suppression
	if(((Int_t)time) >= 4095) raw->setTime(0.0);

	cell=fLoc[0];

	thrCFD = (Int_t)pWallDigiPar->getCFD_Threshold(cell);
	thrADC = (Int_t)pWallDigiPar->getADC_Threshold(cell);
	// CFD and ADC thresholds
	if(((Int_t)charge) < thrCFD){
	    raw->setTime(0.0);
	    if(((Int_t)charge) < thrADC){
		raw->setCharge(0.0);
	    }
	}

    }

    fRawCat->filter(fRawFilter);

    return 0;
}

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