ROOT logo
//*-- AUTHOR Ilse Koenig
//*-- created : 12/03/2014 by Ilse Koenig
//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////////////////
//
// HTrb3Calpar
//
// Calibration parameters of TRB3 TDC
//
///////////////////////////////////////////////////////////////////////

using namespace std;
#include "htrb3calpar.h"
#include "htrb3tdcmessage.h"
#include "TBuffer.h"
#include <iostream>
#include <iomanip>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

ClassImp(HTrb3CalparTdc)
ClassImp(HTrb3Calpar)

HTrb3CalparTdc::HTrb3CalparTdc(void) {
  // constructor
  clear();
}

void HTrb3CalparTdc::clear(void) {
  // clears the data
  subEvtId        = 0;
  nEdgesMask      = 1;
  nChannels       = 0;
  nBinsPerChannel = 0;
  binsPar.Set(0);
}

Int_t HTrb3CalparTdc::makeArray(Int_t subevtid, Int_t edges, Int_t nChan, Int_t nBin) {
  // creates the array for nChan channels with nBin bins each
  subEvtId        = subevtid;
  nEdgesMask      = edges;
  nChannels       = nChan;
  nBinsPerChannel = nBin;
  Int_t nData = nChannels * nBinsPerChannel;
  if (nEdgesMask == 3) nData*=2;
  binsPar.Set(nData);
  binsPar.Reset();
  return nData;
}

Bool_t HTrb3CalparTdc::fillArray(Float_t* data,Int_t nData) {
  // copies the data into the arrays
  Int_t nd = binsPar.GetSize();
  if (nd == nData) {
    memcpy(binsPar.GetArray(),&data[0],nd*sizeof(Float_t));
    return kTRUE;
  } else {
    Error("fillArrays(Float_t*,Int_t)",
          "Invalid number of data (nData: %i, binsPar: %i)",nData,nd);
    return kFALSE;
  }
}

void HTrb3CalparTdc::print(void) {
  // prints the array
  cout<<"   subEvtId: "<<"0x"<<setw(4)<<left<<hex<<subEvtId<<dec<<"   nEdgesMask: "<<nEdgesMask<<"   nChannels: "<<nChannels<<"   nBinsPerChannel: "<<nBinsPerChannel<<'\n';
  cout<<"-------------------------------------------------------------------------------------"<<endl;
  Int_t l=0;
  for(Int_t i=0;i<binsPar.GetSize();i++) {
    l++;
    cout<<setw(13)<<right<<fixed<<setprecision(3)<<binsPar[i];
    if (l==10) {
      cout<<endl;
      l=0;
    }
  }
  if (l>0) cout<<endl;
  cout<<"-------------------------------------------------------------------------------------"<<endl;
}

void HTrb3CalparTdc::write(fstream& fout) {
  // writes the array to file
  fout<<"   subEvtId: "<<"0x"<<setw(4)<<left<<hex<<subEvtId<<dec<<"   nEdgesMask: "<<nEdgesMask<<"   nChannels: "<<nChannels<<"   nBinsPerChannel: "<<nBinsPerChannel<<endl;
  Int_t l=0;
  for(Int_t i=0;i<binsPar.GetSize();i++) {
    l++;
    fout<<setw(13)<<right<<fixed<<setprecision(3)<<binsPar[i];
    if (l==10) {
      fout<<endl;
      l=0;
    }
  }
  if (l>0) fout<<endl;
}

void HTrb3CalparTdc::setSimpleFineCalibration(UInt_t fineMinValue, UInt_t fineMaxValue) {
   // initialize calibrations with linear function
   // before this method is used, the fine limits must be set in HTrb3TdcMessage 
   HTrb3TdcMessage::setFineLimits(fineMinValue,fineMaxValue);
   Float_t* arr = new Float_t[nBinsPerChannel];
   for (Int_t n=0;n<nBinsPerChannel;n++) {
     arr[n] = HTrb3TdcMessage::simpleFineCalibr(n) * 1.e12F;
   }

   for (Int_t nch=0;nch<nChannels;nch++) {
      Float_t* risingArr = getRisingArr(nch);
      if (risingArr) memcpy(risingArr,arr,nBinsPerChannel*sizeof(Float_t));
      Float_t* fallingArr = getFallingArr((UInt_t)nch);
      if (fallingArr) memcpy(fallingArr,arr,nBinsPerChannel*sizeof(Float_t));
   }

   delete [] arr;
}

Bool_t HTrb3CalparTdc::loadFromBinaryFile(const char* filename, Int_t subevtid, Int_t numBins, Int_t nEdgesMask) {
  // reads the parameters from binary file
  // here the file name must be specified
   clear();
   FILE* f = fopen(filename,"r");
   if (f==0) {
      Error("loadFromBinaryFile", "Cannot open file %s for reading calibration", filename);
      return kFALSE;
   }

   ULong64_t numch(0);
   fread(&numch, sizeof(numch), 1, f);

   makeArray(subevtid, nEdgesMask, (Int_t)numch, numBins);

   Float_t* rising_calibr  = new Float_t[numBins];
   Float_t* falling_calibr = new Float_t[numBins];

   for (Int_t ch=0;ch<(Int_t)numch;ch++) {
      fread(rising_calibr, numBins * sizeof(Float_t), 1, f);
      fread(falling_calibr,numBins * sizeof(Float_t), 1, f);

      if (nEdgesMask & 1) {
         Float_t *tgt = getRisingArr(ch);
         if (tgt!=0) {
            for(Int_t bin=0; bin<numBins; bin++)
            tgt[bin] = rising_calibr[bin] * 1.e12F;
         }
      }
      if (nEdgesMask & 2) {
         Float_t *tgt = getFallingArr(ch);
         if (tgt!=0) {
            for(Int_t bin=0; bin<numBins; bin++)
            tgt[bin] = falling_calibr[bin] * 1.e12F;
         }
      }
   }
   delete [] rising_calibr;
   delete [] falling_calibr;
   fclose(f);

   Info("loadFromBinaryFile", "reading calibration from %s done", filename);
   return kTRUE;
}

// ================================================================================

HTrb3Calpar::HTrb3Calpar(const Char_t* name,
                     const Char_t* title,
                     const Char_t* context,
                     Int_t minTrbnetAddress,
		     Int_t maxTrbnetAddress)
           : HParSet(name,title,context) {
  // constructor creates an empty array
  arrayOffset=minTrbnetAddress;
  array = new TObjArray(maxTrbnetAddress-minTrbnetAddress+1);
}

HTrb3Calpar::~ HTrb3Calpar(void) {
  // destructor
  array->Delete();
  delete array;
}

void HTrb3Calpar::clear() {
  // deletes all HTrb2Correction objects from the array and resets the input versions
  array->Delete();
  status=kFALSE;
  resetInputVersions();
}

HTrb3CalparTdc* HTrb3Calpar::addTdc(Int_t address) {
  // adds a new HTrb3CalparTdc objects in the array at position (address-arrayOffset)
  HTrb3CalparTdc* p = getTdc(address);
  if (p != NULL) {
     Error("addTdc","TDC exists already for trbnet-address 0x%04x",address);
  } else {
    p = new HTrb3CalparTdc();
    array->AddAt(p,address-arrayOffset);
  }
  return p;
}

void HTrb3Calpar::printParam() {
  // prints the calibration parameters
  cout<<"Trb3 TDC calibration parameters\n";
  cout<<"-------------------------------------------------------------------------------------\n";
  for(Int_t i=0;i<=array->GetLast();i++) {
    HTrb3CalparTdc* tdc=(*this)[i];
    if (tdc) {
      cout<<"trbnet-address: "<<"0x"<<setw(4)<<left<<hex<<(arrayOffset+i);
      tdc->print();
    }
  }
}

void HTrb3Calpar::putAsciiHeader(TString& header) {
  // header in ASCII file
  header=
    "# TRB3 TDC calibration parameters\n"
    "# Format: trbnetAddress   subEvtId   mask for number of edges   number of channels   number of bins per channel \n"
    "#         rising calpar and/or  falling calpar \n";
}

void HTrb3Calpar::write(fstream& fout) {
  // writes the information of all non-zero HTrb3CalparTdc objects to the ASCII file
  for(Int_t i=0;i<=array->GetLast();i++) {
    HTrb3CalparTdc* tdc=(*this)[i];
    if (tdc) {
      fout<<"trbnet-address:  "<<"0x"<<setw(4)<<left<<hex<<(arrayOffset+i);
      tdc->write(fout);
    }
  }
}

Bool_t HTrb3Calpar::loadFromBinaryFiles(const char* basefname, Int_t subevtid, Int_t numBins, Int_t nEdgesMask) {
  // reads the parameters from binary file
  // here directory and base file name must be specified
   resetInputVersions();
   TString filename;
   Bool_t res = kTRUE;
   for(Int_t i=0;i<=array->GetLast();i++) {
      HTrb3CalparTdc* tdc=(*this)[i];
      if (tdc==0) continue;
      filename.Form("%s%04x.cal", basefname, (unsigned) (arrayOffset+i));
      if (!tdc->loadFromBinaryFile(filename.Data(),subevtid,numBins,nEdgesMask)) res = kFALSE;
   }
   if (res) {
     setChanged();
     setInputVersion(1, 1);
     setStatic();
   }
   return res;
}
 htrb3calpar.cc:1
 htrb3calpar.cc:2
 htrb3calpar.cc:3
 htrb3calpar.cc:4
 htrb3calpar.cc:5
 htrb3calpar.cc:6
 htrb3calpar.cc:7
 htrb3calpar.cc:8
 htrb3calpar.cc:9
 htrb3calpar.cc:10
 htrb3calpar.cc:11
 htrb3calpar.cc:12
 htrb3calpar.cc:13
 htrb3calpar.cc:14
 htrb3calpar.cc:15
 htrb3calpar.cc:16
 htrb3calpar.cc:17
 htrb3calpar.cc:18
 htrb3calpar.cc:19
 htrb3calpar.cc:20
 htrb3calpar.cc:21
 htrb3calpar.cc:22
 htrb3calpar.cc:23
 htrb3calpar.cc:24
 htrb3calpar.cc:25
 htrb3calpar.cc:26
 htrb3calpar.cc:27
 htrb3calpar.cc:28
 htrb3calpar.cc:29
 htrb3calpar.cc:30
 htrb3calpar.cc:31
 htrb3calpar.cc:32
 htrb3calpar.cc:33
 htrb3calpar.cc:34
 htrb3calpar.cc:35
 htrb3calpar.cc:36
 htrb3calpar.cc:37
 htrb3calpar.cc:38
 htrb3calpar.cc:39
 htrb3calpar.cc:40
 htrb3calpar.cc:41
 htrb3calpar.cc:42
 htrb3calpar.cc:43
 htrb3calpar.cc:44
 htrb3calpar.cc:45
 htrb3calpar.cc:46
 htrb3calpar.cc:47
 htrb3calpar.cc:48
 htrb3calpar.cc:49
 htrb3calpar.cc:50
 htrb3calpar.cc:51
 htrb3calpar.cc:52
 htrb3calpar.cc:53
 htrb3calpar.cc:54
 htrb3calpar.cc:55
 htrb3calpar.cc:56
 htrb3calpar.cc:57
 htrb3calpar.cc:58
 htrb3calpar.cc:59
 htrb3calpar.cc:60
 htrb3calpar.cc:61
 htrb3calpar.cc:62
 htrb3calpar.cc:63
 htrb3calpar.cc:64
 htrb3calpar.cc:65
 htrb3calpar.cc:66
 htrb3calpar.cc:67
 htrb3calpar.cc:68
 htrb3calpar.cc:69
 htrb3calpar.cc:70
 htrb3calpar.cc:71
 htrb3calpar.cc:72
 htrb3calpar.cc:73
 htrb3calpar.cc:74
 htrb3calpar.cc:75
 htrb3calpar.cc:76
 htrb3calpar.cc:77
 htrb3calpar.cc:78
 htrb3calpar.cc:79
 htrb3calpar.cc:80
 htrb3calpar.cc:81
 htrb3calpar.cc:82
 htrb3calpar.cc:83
 htrb3calpar.cc:84
 htrb3calpar.cc:85
 htrb3calpar.cc:86
 htrb3calpar.cc:87
 htrb3calpar.cc:88
 htrb3calpar.cc:89
 htrb3calpar.cc:90
 htrb3calpar.cc:91
 htrb3calpar.cc:92
 htrb3calpar.cc:93
 htrb3calpar.cc:94
 htrb3calpar.cc:95
 htrb3calpar.cc:96
 htrb3calpar.cc:97
 htrb3calpar.cc:98
 htrb3calpar.cc:99
 htrb3calpar.cc:100
 htrb3calpar.cc:101
 htrb3calpar.cc:102
 htrb3calpar.cc:103
 htrb3calpar.cc:104
 htrb3calpar.cc:105
 htrb3calpar.cc:106
 htrb3calpar.cc:107
 htrb3calpar.cc:108
 htrb3calpar.cc:109
 htrb3calpar.cc:110
 htrb3calpar.cc:111
 htrb3calpar.cc:112
 htrb3calpar.cc:113
 htrb3calpar.cc:114
 htrb3calpar.cc:115
 htrb3calpar.cc:116
 htrb3calpar.cc:117
 htrb3calpar.cc:118
 htrb3calpar.cc:119
 htrb3calpar.cc:120
 htrb3calpar.cc:121
 htrb3calpar.cc:122
 htrb3calpar.cc:123
 htrb3calpar.cc:124
 htrb3calpar.cc:125
 htrb3calpar.cc:126
 htrb3calpar.cc:127
 htrb3calpar.cc:128
 htrb3calpar.cc:129
 htrb3calpar.cc:130
 htrb3calpar.cc:131
 htrb3calpar.cc:132
 htrb3calpar.cc:133
 htrb3calpar.cc:134
 htrb3calpar.cc:135
 htrb3calpar.cc:136
 htrb3calpar.cc:137
 htrb3calpar.cc:138
 htrb3calpar.cc:139
 htrb3calpar.cc:140
 htrb3calpar.cc:141
 htrb3calpar.cc:142
 htrb3calpar.cc:143
 htrb3calpar.cc:144
 htrb3calpar.cc:145
 htrb3calpar.cc:146
 htrb3calpar.cc:147
 htrb3calpar.cc:148
 htrb3calpar.cc:149
 htrb3calpar.cc:150
 htrb3calpar.cc:151
 htrb3calpar.cc:152
 htrb3calpar.cc:153
 htrb3calpar.cc:154
 htrb3calpar.cc:155
 htrb3calpar.cc:156
 htrb3calpar.cc:157
 htrb3calpar.cc:158
 htrb3calpar.cc:159
 htrb3calpar.cc:160
 htrb3calpar.cc:161
 htrb3calpar.cc:162
 htrb3calpar.cc:163
 htrb3calpar.cc:164
 htrb3calpar.cc:165
 htrb3calpar.cc:166
 htrb3calpar.cc:167
 htrb3calpar.cc:168
 htrb3calpar.cc:169
 htrb3calpar.cc:170
 htrb3calpar.cc:171
 htrb3calpar.cc:172
 htrb3calpar.cc:173
 htrb3calpar.cc:174
 htrb3calpar.cc:175
 htrb3calpar.cc:176
 htrb3calpar.cc:177
 htrb3calpar.cc:178
 htrb3calpar.cc:179
 htrb3calpar.cc:180
 htrb3calpar.cc:181
 htrb3calpar.cc:182
 htrb3calpar.cc:183
 htrb3calpar.cc:184
 htrb3calpar.cc:185
 htrb3calpar.cc:186
 htrb3calpar.cc:187
 htrb3calpar.cc:188
 htrb3calpar.cc:189
 htrb3calpar.cc:190
 htrb3calpar.cc:191
 htrb3calpar.cc:192
 htrb3calpar.cc:193
 htrb3calpar.cc:194
 htrb3calpar.cc:195
 htrb3calpar.cc:196
 htrb3calpar.cc:197
 htrb3calpar.cc:198
 htrb3calpar.cc:199
 htrb3calpar.cc:200
 htrb3calpar.cc:201
 htrb3calpar.cc:202
 htrb3calpar.cc:203
 htrb3calpar.cc:204
 htrb3calpar.cc:205
 htrb3calpar.cc:206
 htrb3calpar.cc:207
 htrb3calpar.cc:208
 htrb3calpar.cc:209
 htrb3calpar.cc:210
 htrb3calpar.cc:211
 htrb3calpar.cc:212
 htrb3calpar.cc:213
 htrb3calpar.cc:214
 htrb3calpar.cc:215
 htrb3calpar.cc:216
 htrb3calpar.cc:217
 htrb3calpar.cc:218
 htrb3calpar.cc:219
 htrb3calpar.cc:220
 htrb3calpar.cc:221
 htrb3calpar.cc:222
 htrb3calpar.cc:223
 htrb3calpar.cc:224
 htrb3calpar.cc:225
 htrb3calpar.cc:226
 htrb3calpar.cc:227
 htrb3calpar.cc:228
 htrb3calpar.cc:229
 htrb3calpar.cc:230
 htrb3calpar.cc:231
 htrb3calpar.cc:232
 htrb3calpar.cc:233
 htrb3calpar.cc:234
 htrb3calpar.cc:235
 htrb3calpar.cc:236
 htrb3calpar.cc:237
 htrb3calpar.cc:238
 htrb3calpar.cc:239
 htrb3calpar.cc:240
 htrb3calpar.cc:241
 htrb3calpar.cc:242
 htrb3calpar.cc:243
 htrb3calpar.cc:244
 htrb3calpar.cc:245
 htrb3calpar.cc:246
 htrb3calpar.cc:247
 htrb3calpar.cc:248
 htrb3calpar.cc:249
 htrb3calpar.cc:250