ROOT logo
//_HADES_CLASS_DESCRIPTION//////////////////////////////////////////////////////////////////
//  HEmcCalibrater:
//
//  Calibrates all fired cells in EmcRaw category and fills
//  the EmcCal category
//
//  embedding = 0 no embedding
//            = 1 embedding
////////////////////////////////////////////////////////////////

#include "hemccalibrater.h"
#include "emcdef.h"
#include "hemcraw.h"
#include "hemccalqa.h"
#include "hemccalsim.h"
#include "hemcdetector.h"
#include "hemccalpar.h"
#include "hemccellstatuspar.h"
#include "hemccalibraterpar.h"
#include "hstartdef.h"
#include "hstart2hit.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 <TMath.h>

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

#define SELECT_FIRST_OR_LAST // Select the first or the last pair, if commented, the last pair will be stored

ClassImp(HEmcCalibrater)
HEmcCalibrater::HEmcCalibrater(void) {
  // default constructor
  pRawCat = NULL;
  pCalCat = NULL;
  iter    = NULL;
  pCalpar = NULL;
  embedding = 0;
}

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

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

Bool_t HEmcCalibrater::init(void) {
  // gets the calibration parameter container
  // gets the EmcRaw category and creates the EmcCal category
  // creates an iterator which loops over all fired cells in EmcRaw
  HEmcDetector* pDet = (HEmcDetector*)gHades->getSetup()->getDetector("Emc");
  if (!pDet) {
    Error("init", "No Emc found.");
    return kFALSE;
  }

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

  pStatuspar = (HEmcCellStatusPar*)gHades->getRuntimeDb()->getContainer("EmcCellStatusPar");
  if (!pStatuspar) return kFALSE;

  pCalibpar = (HEmcCalibraterPar*)gHades->getRuntimeDb()->getContainer("EmcCalibraterPar");
  if (!pCalibpar) return kFALSE;

  pRawCat = gHades->getCurrentEvent()->getCategory(catEmcRaw);
  if (!pRawCat) {
    Warning("init()", "HEmcRaw category not available!");
  }

  if(gHades->getEmbeddingMode()>0) embedding = 1;

  pCalCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catEmcCal));
  if(pCalCat == NULL) {
    if (embedding == 0) pCalCat = pDet->buildMatrixCategory("HEmcCal",0.5); 
    else                pCalCat = pDet->buildMatrixCategory("HEmcCalSim",0.5);
    if(pCalCat == NULL) return kFALSE;
    gHades->getCurrentEvent()->addCategory(catEmcCal,pCalCat,"Emc");
  }

  pStartHitCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catStart2Hit));
  if(pStartHitCat == NULL) {
    Info("HEmcCalibrater::init()", "No Start2Hit category, no Start time correction\n");
  }

#ifdef WITHCALQA
  pQACat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catEmcCalQA));
  if(pQACat == NULL) {
    pQACat = pDet->buildMatrixCategory("HEmcCalQA",0.5);
    if(pQACat == NULL) return kFALSE;
    gHades->getCurrentEvent()->addCategory(catEmcCalQA, pQACat,"Emc");
  }
#endif

  if(pRawCat) iter = (HIterator*)pRawCat->MakeIterator();
  else iter = 0;

  loc.set(2, 0, 0);
  fActive = kTRUE;

  return kTRUE;
}

Float_t twcCorrection(Float_t t, Float_t * twcPars)
{
  if (t > twcPars[2])
    return twcPars[0] + twcPars[1]/TMath::Sqrt(t - twcPars[2]);

  return 0.0;
}

Int_t HEmcCalibrater::execute(void) {
  // calibrates all fired cells

  if(!pRawCat) return 0;

  HEmcRaw *pRaw = NULL;
  HEmcCal *pCal = NULL;

  Int_t  sec   = -1;
  Int_t  cell  = 0;
  Int_t  pos   = 0;
  Char_t row   = -1;
  Char_t col   = -1;
  UInt_t nfasthits = 0, nslowhits=0;

  Float_t rawTimeLeading   = 0.;
  Float_t rawTimeTrailing  = 0.;
  Float_t twcTimeLeading   = 0.;
  Float_t rawTimeLeadingS  = 0.;
  Float_t rawTimeTrailingS = 0.;
  Float_t rawWidth         = 0.;
  Float_t calTimeLeading   = 0.;

  Float_t parCellData[8] = {1.F, 0.F, 0.F, 1.F, 0.F, 0.F, 0.F, 0.F};

  Float_t start_time = 0.0;
  if (pStartHitCat && pStartHitCat->getEntries()>0) {
    HStart2Hit *pStartHit = (HStart2Hit *) pStartHitCat->getObject(0);
    if (pStartHit && pStartHit->getFlag())
        start_time = pStartHit->getTime();
  }

  Float_t diff_min = pCalibpar->getMatchWindowMin();
  Float_t diff_max = pCalibpar->getMatchWindowMax();

  iter->Reset();
  while ((pRaw = (HEmcRaw *)iter->Next()) != 0) {
    Float_t rawLead   = 0.F;
    Float_t rawTot  = 0.F;
    Float_t calTime   = 0.F;
    Float_t calEnergy = 0.F;

    nfasthits = pRaw->getFastMultiplicity();
    nslowhits = pRaw->getSlowMultiplicity();

    if (nfasthits == 0 && nslowhits == 0)
        continue;

    pRaw->getAddress(sec, cell, row, col);

    if (sec < 0)
        continue;

    pos = HEmcDetector::getPositionFromCell(cell);

    if (pStatuspar->getCellStatus(sec, pos) == 0)
        continue;

    loc[0] = sec;
    loc[1] = cell;

    // get the calibration parameters
    HEmcCalParCell &pPar = (*pCalpar)[sec][cell];
    pPar.getData(parCellData);

    Int_t hits_cnt = 0;

#ifdef WITHCALQA
    HEmcCalQA *pQA = (HEmcCalQA*)pQACat->getObject(loc);
    if (!pQA) {
      pQA = (HEmcCalQA *)pQACat->getSlot(loc);
      if (pQA) {
        pQA = new(pQA) HEmcCalQA;
        pQA->setAddress((Char_t)sec, (UChar_t)cell, row, col);
      } else {
        Error("execute()", "Can't get slot for CalQA sector=%i, cell=%i", sec, cell);
        return -1;
      }
    } else {
      Error("execute()", "Slot already exists for CalQA sector=%i, cell=%i", sec, cell);
      return -1;
    }
#endif
    // loop over number of fast hits in raw level
    UInt_t j = 0; // fast trailing
    UInt_t k = 0; // slow leading
    UInt_t l = 0; // slow trailing
    for (UInt_t i = 0; i < nfasthits; ++i)
    {
      rawTimeLeading = pRaw->getFastTimeLeading(i);
      if (0.0 == rawTimeLeading) continue;

#ifdef WITHCALQA
      for (; j < nfasthits; ++j)
      {
        rawTimeTrailing = pRaw->getFastTimeTrailing(j);
        if (0.0 == rawTimeTrailing) continue;

        if (rawTimeTrailing < rawTimeLeading) continue;
        pQA->addFastHit(rawTimeLeading * parCellData[0] + parCellData[1], (rawTimeTrailing - rawTimeLeading) * parCellData[0]);
        break;
      }
#endif

      for (; k < nslowhits; ++k)
      {
        rawTimeLeadingS = pRaw->getSlowTimeLeading(k);
        if (0.0 == rawTimeLeadingS) continue;

        Float_t diff = rawTimeLeadingS - rawTimeLeading;
        if (diff < diff_min) continue;      // slow leading to fast
        if (diff > diff_max) break;         // slow leading to late

#ifdef WITHCALQA
        for (UInt_t _l = l; _l < nslowhits; ++_l)
        {
          rawTimeTrailingS = pRaw->getSlowTimeTrailing(_l);
          if (0.0 == rawTimeTrailingS) continue;

          if (rawTimeTrailingS < rawTimeLeadingS) continue;
          pQA->addSlowHit(rawTimeLeadingS * parCellData[0] + parCellData[1], (rawTimeTrailingS - rawTimeLeadingS) * parCellData[0]);
          break;
        }
#endif

        // search for matching slow trailing
        for (; l < nslowhits; ++l)
        {
          rawTimeTrailingS = pRaw->getSlowTimeTrailing(l);
          if (0.0 == rawTimeTrailingS) continue;

          if (rawTimeTrailingS < rawTimeLeadingS) continue;

          rawWidth = rawTimeTrailingS - rawTimeLeading;

          // calc Time Walk Correction
          Float_t twc = twcCorrection(rawWidth, (parCellData+5));
          twcTimeLeading = rawTimeLeading - twc;

          // correct the time and width
          calTimeLeading = parCellData[0] * twcTimeLeading + parCellData[1];
          Float_t calWidth = rawWidth * parCellData[0];

#ifdef WITHCALQA
          pQA->addMatchedHit(parCellData[0] * rawTimeLeading + parCellData[1], calWidth);
#endif

          ++hits_cnt;
#ifdef SELECT_FIRST_OR_LAST
          if (hits_cnt > 1) break;
#endif

          Float_t corrTime = calTimeLeading - start_time;

          rawLead = rawTimeLeading;
          rawTot = rawWidth;
          calTime = corrTime;
	  calEnergy = parCellData[2]+exp( parCellData[3]+ calWidth*parCellData[4]);
          break;
        }
        break;
      }
    }

    // store the last found hit
    if (hits_cnt)
    {
      pCal = (HEmcCal*)pCalCat->getObject(loc);
      if (!pCal) {
        pCal = (HEmcCal *)pCalCat->getSlot(loc);
        if (pCal) {
        if(embedding == 0) pCal = new(pCal) HEmcCal;
        else               pCal = new(pCal) HEmcCalSim;
        pCal->setAddress((Char_t)sec, (UChar_t)cell, row, col);
        } else {
        Error("execute()", "Can't get slot sector=%i, cell=%i", sec, cell);
        return -1;
        }
      } else {
        Error("execute()", "Slot already exists for sector=%i, cell=%i", sec, cell);
        return -1;
      }

      // fill cal hits
      pCal->setLead(rawLead);
      pCal->setWidth(rawTot);
      pCal->setTime(calTime);
      pCal->setEnergy(calEnergy);

      pCal->setNHits(hits_cnt);
    }
  }
  return 0;
}
 hemccalibrater.cc:1
 hemccalibrater.cc:2
 hemccalibrater.cc:3
 hemccalibrater.cc:4
 hemccalibrater.cc:5
 hemccalibrater.cc:6
 hemccalibrater.cc:7
 hemccalibrater.cc:8
 hemccalibrater.cc:9
 hemccalibrater.cc:10
 hemccalibrater.cc:11
 hemccalibrater.cc:12
 hemccalibrater.cc:13
 hemccalibrater.cc:14
 hemccalibrater.cc:15
 hemccalibrater.cc:16
 hemccalibrater.cc:17
 hemccalibrater.cc:18
 hemccalibrater.cc:19
 hemccalibrater.cc:20
 hemccalibrater.cc:21
 hemccalibrater.cc:22
 hemccalibrater.cc:23
 hemccalibrater.cc:24
 hemccalibrater.cc:25
 hemccalibrater.cc:26
 hemccalibrater.cc:27
 hemccalibrater.cc:28
 hemccalibrater.cc:29
 hemccalibrater.cc:30
 hemccalibrater.cc:31
 hemccalibrater.cc:32
 hemccalibrater.cc:33
 hemccalibrater.cc:34
 hemccalibrater.cc:35
 hemccalibrater.cc:36
 hemccalibrater.cc:37
 hemccalibrater.cc:38
 hemccalibrater.cc:39
 hemccalibrater.cc:40
 hemccalibrater.cc:41
 hemccalibrater.cc:42
 hemccalibrater.cc:43
 hemccalibrater.cc:44
 hemccalibrater.cc:45
 hemccalibrater.cc:46
 hemccalibrater.cc:47
 hemccalibrater.cc:48
 hemccalibrater.cc:49
 hemccalibrater.cc:50
 hemccalibrater.cc:51
 hemccalibrater.cc:52
 hemccalibrater.cc:53
 hemccalibrater.cc:54
 hemccalibrater.cc:55
 hemccalibrater.cc:56
 hemccalibrater.cc:57
 hemccalibrater.cc:58
 hemccalibrater.cc:59
 hemccalibrater.cc:60
 hemccalibrater.cc:61
 hemccalibrater.cc:62
 hemccalibrater.cc:63
 hemccalibrater.cc:64
 hemccalibrater.cc:65
 hemccalibrater.cc:66
 hemccalibrater.cc:67
 hemccalibrater.cc:68
 hemccalibrater.cc:69
 hemccalibrater.cc:70
 hemccalibrater.cc:71
 hemccalibrater.cc:72
 hemccalibrater.cc:73
 hemccalibrater.cc:74
 hemccalibrater.cc:75
 hemccalibrater.cc:76
 hemccalibrater.cc:77
 hemccalibrater.cc:78
 hemccalibrater.cc:79
 hemccalibrater.cc:80
 hemccalibrater.cc:81
 hemccalibrater.cc:82
 hemccalibrater.cc:83
 hemccalibrater.cc:84
 hemccalibrater.cc:85
 hemccalibrater.cc:86
 hemccalibrater.cc:87
 hemccalibrater.cc:88
 hemccalibrater.cc:89
 hemccalibrater.cc:90
 hemccalibrater.cc:91
 hemccalibrater.cc:92
 hemccalibrater.cc:93
 hemccalibrater.cc:94
 hemccalibrater.cc:95
 hemccalibrater.cc:96
 hemccalibrater.cc:97
 hemccalibrater.cc:98
 hemccalibrater.cc:99
 hemccalibrater.cc:100
 hemccalibrater.cc:101
 hemccalibrater.cc:102
 hemccalibrater.cc:103
 hemccalibrater.cc:104
 hemccalibrater.cc:105
 hemccalibrater.cc:106
 hemccalibrater.cc:107
 hemccalibrater.cc:108
 hemccalibrater.cc:109
 hemccalibrater.cc:110
 hemccalibrater.cc:111
 hemccalibrater.cc:112
 hemccalibrater.cc:113
 hemccalibrater.cc:114
 hemccalibrater.cc:115
 hemccalibrater.cc:116
 hemccalibrater.cc:117
 hemccalibrater.cc:118
 hemccalibrater.cc:119
 hemccalibrater.cc:120
 hemccalibrater.cc:121
 hemccalibrater.cc:122
 hemccalibrater.cc:123
 hemccalibrater.cc:124
 hemccalibrater.cc:125
 hemccalibrater.cc:126
 hemccalibrater.cc:127
 hemccalibrater.cc:128
 hemccalibrater.cc:129
 hemccalibrater.cc:130
 hemccalibrater.cc:131
 hemccalibrater.cc:132
 hemccalibrater.cc:133
 hemccalibrater.cc:134
 hemccalibrater.cc:135
 hemccalibrater.cc:136
 hemccalibrater.cc:137
 hemccalibrater.cc:138
 hemccalibrater.cc:139
 hemccalibrater.cc:140
 hemccalibrater.cc:141
 hemccalibrater.cc:142
 hemccalibrater.cc:143
 hemccalibrater.cc:144
 hemccalibrater.cc:145
 hemccalibrater.cc:146
 hemccalibrater.cc:147
 hemccalibrater.cc:148
 hemccalibrater.cc:149
 hemccalibrater.cc:150
 hemccalibrater.cc:151
 hemccalibrater.cc:152
 hemccalibrater.cc:153
 hemccalibrater.cc:154
 hemccalibrater.cc:155
 hemccalibrater.cc:156
 hemccalibrater.cc:157
 hemccalibrater.cc:158
 hemccalibrater.cc:159
 hemccalibrater.cc:160
 hemccalibrater.cc:161
 hemccalibrater.cc:162
 hemccalibrater.cc:163
 hemccalibrater.cc:164
 hemccalibrater.cc:165
 hemccalibrater.cc:166
 hemccalibrater.cc:167
 hemccalibrater.cc:168
 hemccalibrater.cc:169
 hemccalibrater.cc:170
 hemccalibrater.cc:171
 hemccalibrater.cc:172
 hemccalibrater.cc:173
 hemccalibrater.cc:174
 hemccalibrater.cc:175
 hemccalibrater.cc:176
 hemccalibrater.cc:177
 hemccalibrater.cc:178
 hemccalibrater.cc:179
 hemccalibrater.cc:180
 hemccalibrater.cc:181
 hemccalibrater.cc:182
 hemccalibrater.cc:183
 hemccalibrater.cc:184
 hemccalibrater.cc:185
 hemccalibrater.cc:186
 hemccalibrater.cc:187
 hemccalibrater.cc:188
 hemccalibrater.cc:189
 hemccalibrater.cc:190
 hemccalibrater.cc:191
 hemccalibrater.cc:192
 hemccalibrater.cc:193
 hemccalibrater.cc:194
 hemccalibrater.cc:195
 hemccalibrater.cc:196
 hemccalibrater.cc:197
 hemccalibrater.cc:198
 hemccalibrater.cc:199
 hemccalibrater.cc:200
 hemccalibrater.cc:201
 hemccalibrater.cc:202
 hemccalibrater.cc:203
 hemccalibrater.cc:204
 hemccalibrater.cc:205
 hemccalibrater.cc:206
 hemccalibrater.cc:207
 hemccalibrater.cc:208
 hemccalibrater.cc:209
 hemccalibrater.cc:210
 hemccalibrater.cc:211
 hemccalibrater.cc:212
 hemccalibrater.cc:213
 hemccalibrater.cc:214
 hemccalibrater.cc:215
 hemccalibrater.cc:216
 hemccalibrater.cc:217
 hemccalibrater.cc:218
 hemccalibrater.cc:219
 hemccalibrater.cc:220
 hemccalibrater.cc:221
 hemccalibrater.cc:222
 hemccalibrater.cc:223
 hemccalibrater.cc:224
 hemccalibrater.cc:225
 hemccalibrater.cc:226
 hemccalibrater.cc:227
 hemccalibrater.cc:228
 hemccalibrater.cc:229
 hemccalibrater.cc:230
 hemccalibrater.cc:231
 hemccalibrater.cc:232
 hemccalibrater.cc:233
 hemccalibrater.cc:234
 hemccalibrater.cc:235
 hemccalibrater.cc:236
 hemccalibrater.cc:237
 hemccalibrater.cc:238
 hemccalibrater.cc:239
 hemccalibrater.cc:240
 hemccalibrater.cc:241
 hemccalibrater.cc:242
 hemccalibrater.cc:243
 hemccalibrater.cc:244
 hemccalibrater.cc:245
 hemccalibrater.cc:246
 hemccalibrater.cc:247
 hemccalibrater.cc:248
 hemccalibrater.cc:249
 hemccalibrater.cc:250
 hemccalibrater.cc:251
 hemccalibrater.cc:252
 hemccalibrater.cc:253
 hemccalibrater.cc:254
 hemccalibrater.cc:255
 hemccalibrater.cc:256
 hemccalibrater.cc:257
 hemccalibrater.cc:258
 hemccalibrater.cc:259
 hemccalibrater.cc:260
 hemccalibrater.cc:261
 hemccalibrater.cc:262
 hemccalibrater.cc:263
 hemccalibrater.cc:264
 hemccalibrater.cc:265
 hemccalibrater.cc:266
 hemccalibrater.cc:267
 hemccalibrater.cc:268
 hemccalibrater.cc:269
 hemccalibrater.cc:270
 hemccalibrater.cc:271
 hemccalibrater.cc:272
 hemccalibrater.cc:273
 hemccalibrater.cc:274
 hemccalibrater.cc:275
 hemccalibrater.cc:276
 hemccalibrater.cc:277
 hemccalibrater.cc:278
 hemccalibrater.cc:279
 hemccalibrater.cc:280
 hemccalibrater.cc:281
 hemccalibrater.cc:282
 hemccalibrater.cc:283
 hemccalibrater.cc:284
 hemccalibrater.cc:285
 hemccalibrater.cc:286
 hemccalibrater.cc:287
 hemccalibrater.cc:288
 hemccalibrater.cc:289
 hemccalibrater.cc:290
 hemccalibrater.cc:291
 hemccalibrater.cc:292
 hemccalibrater.cc:293
 hemccalibrater.cc:294
 hemccalibrater.cc:295
 hemccalibrater.cc:296
 hemccalibrater.cc:297
 hemccalibrater.cc:298
 hemccalibrater.cc:299
 hemccalibrater.cc:300
 hemccalibrater.cc:301
 hemccalibrater.cc:302
 hemccalibrater.cc:303
 hemccalibrater.cc:304
 hemccalibrater.cc:305
 hemccalibrater.cc:306
 hemccalibrater.cc:307
 hemccalibrater.cc:308
 hemccalibrater.cc:309
 hemccalibrater.cc:310
 hemccalibrater.cc:311
 hemccalibrater.cc:312
 hemccalibrater.cc:313
 hemccalibrater.cc:314
 hemccalibrater.cc:315
 hemccalibrater.cc:316
 hemccalibrater.cc:317
 hemccalibrater.cc:318
 hemccalibrater.cc:319
 hemccalibrater.cc:320
 hemccalibrater.cc:321
 hemccalibrater.cc:322
 hemccalibrater.cc:323
 hemccalibrater.cc:324
 hemccalibrater.cc:325
 hemccalibrater.cc:326
 hemccalibrater.cc:327