File indexing completed on 2026-05-20 07:39:05
0001 #pragma once
0002 #ifndef COMMONHELPERFUNCTIONS_H
0003 #define COMMONHELPERFUNCTIONS_H
0004
0005 #include <iostream>
0006 #include <fstream>
0007 #include "TString.h"
0008 #include "TObjString.h"
0009 #include <vector>
0010 #include <map>
0011 #include <utility>
0012
0013 #include <cstdint>
0014 #include <string>
0015
0016 struct Layer{
0017 Layer(): nCells(0), energy(0.), avX(0.), avY(0.) {}
0018 double nCells;
0019 double energy;
0020 double avX;
0021 double avY;
0022 } ;
0023
0024 inline int GetMaxLayer(std::map<int,Layer> layers){
0025 int maxLayer = -1;
0026 double maxELayer = 0;
0027 std::map<int, Layer>::iterator ithLayer;
0028 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0029 if (maxELayer < ithLayer->second.energy ){
0030 maxELayer = ithLayer->second.energy;
0031 maxLayer = ithLayer->first;
0032 }
0033 }
0034 return maxLayer;
0035 }
0036 inline double GetAverageLayer(std::map<int,Layer> layers){
0037 double avLayer = 0;
0038 double totE = 0;
0039 std::map<int, Layer>::iterator ithLayer;
0040 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0041 avLayer += ithLayer->first*ithLayer->second.energy;
0042 totE += ithLayer->second.energy;
0043 }
0044 avLayer = avLayer/totE;
0045 return avLayer;
0046 }
0047
0048 inline double GetXAverage(std::map<int,Layer> layers, int layerMax = -100){
0049 double avLayer = 0;
0050 double totE = 0;
0051 std::map<int, Layer>::iterator ithLayer;
0052 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0053 if ((layerMax != -100) && (ithLayer->first > layerMax) )
0054 continue;
0055 avLayer += ithLayer->second.avX*ithLayer->second.energy;
0056 totE += ithLayer->second.energy;
0057 }
0058 avLayer = avLayer/totE;
0059 return avLayer;
0060 }
0061
0062 inline double GetYAverage(std::map<int,Layer> layers, int layerMax = -100){
0063 double avLayer = 0;
0064 double totE = 0;
0065 std::map<int, Layer>::iterator ithLayer;
0066 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0067 if ( (layerMax !=-100) && (ithLayer->first > layerMax) )
0068 continue;
0069 avLayer += ithLayer->second.avY*ithLayer->second.energy;
0070 totE += ithLayer->second.energy;
0071 }
0072 avLayer = avLayer/totE;
0073 return avLayer;
0074 }
0075
0076 struct RunInfo{
0077 RunInfo(): runNr(0), species(""), pdg(0), energy(0), vop(0), vbr(0), lgSet(0), hgSet(0), posX(0), posY(0), shapetime(0), assemblyNr(0), year(-1), month(-1), readout(""), facility(""), beamline(""), samples(0), trigDelay(0), trigDead(0), phase(0), nFPGA(0), nASIC(0), rf(12), cf(10), cc(12), cfcomp(10), temp(20.), injMode(0), injDAC(0) {}
0078 int runNr;
0079 TString species;
0080 int pdg;
0081 float energy;
0082 float vop;
0083 float vbr;
0084 int lgSet;
0085 int hgSet;
0086 float posX;
0087 float posY;
0088 float shapetime;
0089 int assemblyNr;
0090 int year;
0091 int month;
0092 TString readout;
0093 TString facility;
0094 TString beamline;
0095 int samples;
0096 int trigDelay;
0097 int trigDead;
0098 int phase;
0099 int nFPGA;
0100 int nASIC;
0101 int rf;
0102 int cf;
0103 int cc;
0104 int cfcomp;
0105 float temp;
0106 int injMode;
0107 int injDAC;
0108 } ;
0109
0110 TString GetStringFromRunInfo(RunInfo, Int_t);
0111
0112
0113
0114
0115
0116 inline std::map<int,RunInfo> readRunInfosFromFile(TString runListFileName, int debug, int specialData = 0 ){
0117 std::map<int,RunInfo> runs;
0118
0119 std::ifstream runListFile;
0120 runListFile.open(runListFileName,std::ios_base::in);
0121 if (!runListFile) {
0122 std::cout << "ERROR: file " << runListFileName.Data() << " not found!" << std::endl;
0123 return runs;
0124 }
0125
0126 TString facility="";
0127 TString beamline="";
0128 TString readout="";
0129 int year = -1;
0130 int month = -1;
0131 for( TString tempLine; tempLine.ReadLine(runListFile, kTRUE); ) {
0132
0133 if (tempLine.BeginsWith("%") || tempLine.BeginsWith("#")){
0134 continue;
0135 }
0136 if (debug > 1) std::cout << tempLine.Data() << std::endl;
0137
0138 TObjArray *tempArr2 = tempLine.Tokenize(" ");
0139 if(tempArr2->GetEntries()>0){
0140 if (tempLine.BeginsWith("year")){
0141 year=((TString)((TObjString*)tempArr2->At(1))->GetString()).Atoi();
0142 continue;
0143 } else if (tempLine.BeginsWith("month")){
0144 month=((TString)((TObjString*)tempArr2->At(1))->GetString()).Atoi();
0145 continue;
0146 } else if (tempLine.BeginsWith("readout")){
0147 readout=((TString)((TObjString*)tempArr2->At(1))->GetString());
0148 continue;
0149 } else if (tempLine.BeginsWith("facility")){
0150 facility=((TString)((TObjString*)tempArr2->At(1))->GetString());
0151 continue;
0152 } else if (tempLine.BeginsWith("beam-line")){
0153 beamline=((TString)((TObjString*)tempArr2->At(1))->GetString());
0154 continue;
0155 }
0156 }
0157
0158 TObjArray *tempArr = tempLine.Tokenize(",");
0159 if(tempArr->GetEntries()<1){
0160 if (debug > 1) std::cout << "nothing to be done" << std::endl;
0161 delete tempArr;
0162 continue;
0163 }
0164
0165
0166 RunInfo tempRun;
0167 tempRun.facility= facility;
0168 tempRun.beamline= beamline;
0169 tempRun.readout = readout;
0170 tempRun.year = year;
0171 tempRun.month = month;
0172
0173
0174 if (beamline.CompareTo("injection") != 0){
0175 tempRun.runNr = ((TString)((TObjString*)tempArr->At(0))->GetString()).Atoi();
0176 tempRun.species = (TString)((TObjString*)tempArr->At(1))->GetString();
0177 tempRun.pdg = ((TString)((TObjString*)tempArr->At(2))->GetString()).Atoi();
0178 tempRun.energy = ((TString)((TObjString*)tempArr->At(3))->GetString()).Atof();
0179 tempRun.vop = ((TString)((TObjString*)tempArr->At(4))->GetString()).Atof();
0180 tempRun.vbr = ((TString)((TObjString*)tempArr->At(5))->GetString()).Atof();
0181
0182 if (readout.CompareTo("CAEN") == 0){
0183 tempRun.hgSet = ((TString)((TObjString*)tempArr->At(6))->GetString()).Atoi();
0184 tempRun.lgSet = ((TString)((TObjString*)tempArr->At(7))->GetString()).Atoi();
0185 if (tempArr->GetEntries() > 10){
0186 tempRun.shapetime = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atof();
0187 }
0188 } else {
0189 tempRun.trigDelay = ((TString)((TObjString*)tempArr->At(6))->GetString()).Atoi();
0190 tempRun.samples = ((TString)((TObjString*)tempArr->At(7))->GetString()).Atoi();
0191 tempRun.trigDead = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atoi();
0192 tempRun.phase = ((TString)((TObjString*)tempArr->At(11))->GetString()).Atoi();
0193 tempRun.nFPGA = ((TString)((TObjString*)tempArr->At(12))->GetString()).Atoi();
0194 tempRun.nASIC = ((TString)((TObjString*)tempArr->At(13))->GetString()).Atoi();
0195 }
0196 tempRun.posX = ((TString)((TObjString*)tempArr->At(8))->GetString()).Atoi();
0197 tempRun.posY = ((TString)((TObjString*)tempArr->At(9))->GetString()).Atoi();
0198 if (specialData == 1) tempRun.assemblyNr = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atoi();
0199
0200 tempRun.rf = 12;
0201 tempRun.cf = 10;
0202 tempRun.cc = 12;
0203 tempRun.cfcomp = 10;
0204 tempRun.temp = -1.;
0205 tempRun.injMode = -1;
0206 tempRun.injDAC = -1;
0207
0208 if (debug > 1) std::cout << "Run " << tempRun.runNr << "\t species: " << tempRun.species << "\t energy: " << tempRun.energy << "\t Vop: " << tempRun.vop << "\t Vov: " << tempRun.vop-tempRun.vbr << "\t Xbeam: " << tempRun.posX<< "\t Ybeam: " << tempRun.posY << "\t shaping time: " << tempRun.shapetime << std::endl;
0209
0210
0211 } else {
0212 tempRun.runNr = ((TString)((TObjString*)tempArr->At(0))->GetString()).Atoi();
0213 tempRun.species = (TString)((TObjString*)tempArr->At(1))->GetString();
0214 tempRun.pdg = 0;
0215 tempRun.energy = 0.;
0216 tempRun.vop = ((TString)((TObjString*)tempArr->At(2))->GetString()).Atof();
0217 tempRun.vbr = ((TString)((TObjString*)tempArr->At(3))->GetString()).Atof();
0218 tempRun.posX = 0.;
0219 tempRun.posY = 0.;
0220 tempRun.samples = ((TString)((TObjString*)tempArr->At(4))->GetString()).Atoi();
0221 tempRun.trigDelay = 0;
0222 tempRun.trigDead = ((TString)((TObjString*)tempArr->At(5))->GetString()).Atoi();
0223 tempRun.phase = ((TString)((TObjString*)tempArr->At(6))->GetString()).Atoi();
0224 tempRun.nFPGA = ((TString)((TObjString*)tempArr->At(7))->GetString()).Atoi();
0225 tempRun.nASIC = ((TString)((TObjString*)tempArr->At(8))->GetString()).Atoi();
0226 tempRun.rf = ((TString)((TObjString*)tempArr->At(9))->GetString()).Atoi();
0227 tempRun.cf = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atoi();
0228 tempRun.cc = ((TString)((TObjString*)tempArr->At(11))->GetString()).Atoi();
0229 tempRun.cfcomp = ((TString)((TObjString*)tempArr->At(12))->GetString()).Atoi();
0230 tempRun.temp = 20.;
0231 tempRun.injMode = ((TString)((TObjString*)tempArr->At(13))->GetString()).Atoi();
0232 tempRun.injDAC = ((TString)((TObjString*)tempArr->At(14))->GetString()).Atoi();
0233 if (debug > 1) std::cout << "Run " << tempRun.runNr << "\t type: " << tempRun.species << "\t Vop: " << tempRun.vop << "\t Vov: " << tempRun.vop-tempRun.vbr << "\t RF: " << tempRun.rf <<"\t CF: " << tempRun.cf<< "\t CC: " << tempRun.cc<< "\t CFcomp: "<< tempRun.cfcomp<< "\t inj mode: " << tempRun.injMode<< "\t inj value: "<< tempRun.injDAC<< std::endl;
0234 }
0235 runs[tempRun.runNr]=tempRun;
0236 }
0237 std::cout << year << "-" << month << "\t:\t" << facility.Data() << "-" << beamline.Data() << "\t Readout: " << readout.Data() << std::endl;
0238 std::cout << "registered " << runs.size() << " runs from "<< runListFileName.Data() << std::endl;
0239
0240 return runs;
0241 };
0242
0243 inline int GetSpeciesIntFromRunInfo(RunInfo currRunInfo){
0244 if (currRunInfo.species.Contains("cosmics")){
0245 return 0;
0246 } else if (currRunInfo.species.CompareTo("g") == 0){
0247 return 1;
0248 } else if (currRunInfo.species.Contains("muon") || currRunInfo.species.Contains("Muon") || currRunInfo.species.CompareTo("mu-") == 0){
0249 return 2;
0250 } else if (currRunInfo.species.Contains("Electron") || currRunInfo.species.Contains("electron") || currRunInfo.species.CompareTo("e-") == 0 ){
0251 return 3;
0252 } else if (currRunInfo.species.Contains("Positron") || currRunInfo.species.Contains("positron") || currRunInfo.species.CompareTo("e+") == 0 ){
0253 return 6;
0254 } else if (currRunInfo.species.Contains("Pion") || currRunInfo.species.Contains("pion") || currRunInfo.species.CompareTo("pi-") == 0 || currRunInfo.species.CompareTo("pi+") == 0 ){
0255 return 4;
0256 } else if (currRunInfo.species.Contains("Hadron") || currRunInfo.species.Contains("hadron") || currRunInfo.species.CompareTo("h+") == 0 || currRunInfo.species.CompareTo("h-") == 0 ){
0257 return 5;
0258 }
0259
0260 return -1;
0261 }
0262
0263 inline TString GetSpeciesStringFromPDG(int pdg){
0264 switch (pdg){
0265 case 0:
0266 return "ped";
0267 case 11:
0268 return "e^{-}";
0269 case -11:
0270 return "e^{+}";
0271 case 13:
0272 return "#mu^{-}";
0273 case -13:
0274 return "#mu^{+}";
0275 case 211:
0276 return "#pi^{+}";
0277 case -211:
0278 return "#pi^{-}";
0279 case 2212:
0280 return "p";
0281 case -2212:
0282 return "#bar{p}";
0283 default:
0284 return "";
0285 }
0286 }
0287
0288
0289 inline Double_t ReturnMipPlotRangeDepVov(double Vov, bool isHG, ReadOut::Type type){
0290 if (type == ReadOut::Type::Caen){
0291 if (isHG){
0292 if (Vov < 2)
0293 return 550.;
0294 else if (Vov < 3)
0295 return 750.;
0296 else if (Vov < 4)
0297 return 950.;
0298 else if (Vov < 5)
0299 return 1150.;
0300 else
0301 return 1350.;
0302 } else {
0303 if (Vov < 2)
0304 return 85.;
0305 else if (Vov < 3)
0306 return 105.;
0307 else if (Vov < 4)
0308 return 125.;
0309 else if (Vov < 5)
0310 return 145.;
0311 else
0312 return 165.;
0313 }
0314 } else {
0315 return 250.;
0316 }
0317 }
0318
0319 inline Double_t ReturnMipMinPlotRangeDepVov(double Vov, bool isHG, ReadOut::Type type){
0320 if (type == ReadOut::Type::Caen){
0321 if (isHG){
0322 return -100;
0323 } else {
0324 return -100;
0325 }
0326 } else {
0327 return -25.;
0328 }
0329 }
0330
0331 inline Double_t ReturnRFValue(int rf, int debug = 0){
0332 if (debug) std::cout << "RF: " << rf ;
0333 Double_t rfOhm = 0;
0334 Double_t ohmBit[4] = {100., 66.66, 50., 25.};
0335 if ((rf - 8) >= 0){
0336 rfOhm = rfOhm+1/ohmBit[3];
0337 rf = rf-8;
0338 }
0339 if ((rf - 4) >= 0){
0340 rfOhm = rfOhm+1/ohmBit[2];
0341 rf = rf-4;
0342 }
0343 if ((rf - 2) >= 0){
0344 rfOhm = rfOhm+1/ohmBit[1];
0345 rf = rf-2;
0346 }
0347 if ((rf - 1) == 0){
0348 rfOhm = rfOhm+1/ohmBit[0];
0349 rf = rf-1;
0350 }
0351 if (debug) std::cout << "\t" << rfOhm << " kOhm" << std::endl;
0352 return 1./rfOhm;
0353 }
0354
0355 inline Double_t ReturnCFValue(int cf, int debug = 0){
0356 if (debug) std::cout << "CF: " << cf ;
0357 Double_t cffF = 0;
0358 if ((cf - 8) >= 0){
0359 cffF = cffF+400;
0360 cf = cf-8;
0361 }
0362 if ((cf - 4) >= 0){
0363 cffF = cffF+200;
0364 cf = cf-4;
0365 }
0366 if ((cf - 2) >= 0){
0367 cffF = cffF+100;
0368 cf = cf-2;
0369 }
0370 if ((cf - 1) == 0){
0371 cffF = cffF+50;
0372 cf = cf-1;
0373 }
0374 if (debug) std::cout << "\t" << cffF << " fF" << std::endl;
0375 return cffF;
0376 }
0377
0378 inline Double_t ReturnCFCompValue(int cf, int debug = 0){
0379 if (debug) std::cout << "CFComp: " << cf ;
0380 Double_t cffF = 0;
0381 if ((cf - 8) >= 0){
0382 cffF = cffF+400;
0383 cf = cf-8;
0384 }
0385 if ((cf - 4) >= 0){
0386 cffF = cffF+200;
0387 cf = cf-4;
0388 }
0389 if ((cf - 2) >= 0){
0390 cffF = cffF+100;
0391 cf = cf-2;
0392 }
0393 if ((cf - 1) == 0){
0394 cffF = cffF+50;
0395 cf = cf-1;
0396 }
0397 if (debug) std::cout << "\t" << cffF << " fF" << std::endl;
0398 return cffF;
0399 }
0400
0401 inline Double_t ReturnCCValue(int cc, int debug = 0){
0402 if (debug) std::cout << "CFComp: " << cc ;
0403 Double_t ccVal = 0;
0404 if ((cc - 8) >= 0){
0405 ccVal = ccVal+0.2;
0406 cc = cc-8;
0407 }
0408 if ((cc - 4) >= 0){
0409 ccVal = ccVal+0.1;
0410 cc = cc-4;
0411 }
0412 if ((cc - 2) >= 0){
0413 ccVal = ccVal+0.05;
0414 cc = cc-2;
0415 }
0416 if ((cc - 1) == 0){
0417 ccVal = ccVal+0.025;
0418 cc = cc-1;
0419 }
0420 if (debug) std::cout << "\t" << ccVal << std::endl;
0421 return ccVal;
0422 }
0423
0424 inline TString GetLabelHGCROCSettings(RunInfo currRunInfo){
0425 TString label = "";
0426 if (currRunInfo.rf > -1)
0427 label = Form("%sRF=%.1fk#Omega ",label.Data() , ReturnRFValue(currRunInfo.rf));
0428 if (currRunInfo.cf > -1)
0429 label = Form("%sCF=%.1ffF ",label.Data() , ReturnCFValue(currRunInfo.cf));
0430 if (currRunInfo.cfcomp > -1)
0431 label = Form("%sCF_{comp}=%.1ffF ",label.Data() , ReturnCFCompValue(currRunInfo.cfcomp));
0432 if (currRunInfo.cc > -1)
0433 label = Form("%sCC=%.3f",label.Data() , ReturnCCValue(currRunInfo.cc));
0434 return label;
0435 }
0436 inline TString GetLabelHGCROCSettingsCF(RunInfo currRunInfo){
0437 TString label = "";
0438 if (currRunInfo.cf > -1)
0439 label = Form("%sCF=%.1ffF ",label.Data() , ReturnCFValue(currRunInfo.cf));
0440 if (currRunInfo.cfcomp > -1)
0441 label = Form("%sCF_{comp}=%.1ffF",label.Data() , ReturnCFCompValue(currRunInfo.cfcomp));
0442 return label;
0443 }
0444 inline TString GetLabelHGCROCSettingsRFCC(RunInfo currRunInfo){
0445 TString label = "";
0446 if (currRunInfo.rf > -1)
0447 label = Form("%sRF=%.1fk#Omega ",label.Data() , ReturnRFValue(currRunInfo.rf));
0448 if (currRunInfo.cc > -1)
0449 label = Form("%sCC=%.3f",label.Data() , ReturnCCValue(currRunInfo.cc));
0450 return label;
0451 }
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490 #endif