File indexing completed on 2025-07-03 07:56:06
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 struct Layer{
0014 Layer(): nCells(0), energy(0.), avX(0.), avY(0.) {}
0015 double nCells;
0016 double energy;
0017 double avX;
0018 double avY;
0019 } ;
0020
0021 inline int GetMaxLayer(std::map<int,Layer> layers){
0022 int maxLayer = -1;
0023 double maxELayer = 0;
0024 std::map<int, Layer>::iterator ithLayer;
0025 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0026 if (maxELayer < ithLayer->second.energy ){
0027 maxELayer = ithLayer->second.energy;
0028 maxLayer = ithLayer->first;
0029 }
0030 }
0031 return maxLayer;
0032 }
0033 inline double GetAverageLayer(std::map<int,Layer> layers){
0034 double avLayer = 0;
0035 double totE = 0;
0036 std::map<int, Layer>::iterator ithLayer;
0037 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0038 avLayer += ithLayer->first*ithLayer->second.energy;
0039 totE += ithLayer->second.energy;
0040 }
0041 avLayer = avLayer/totE;
0042 return avLayer;
0043 }
0044
0045 inline double GetXAverage(std::map<int,Layer> layers, int layerMax = -100){
0046 double avLayer = 0;
0047 double totE = 0;
0048 std::map<int, Layer>::iterator ithLayer;
0049 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0050 if ((layerMax != -100) && (ithLayer->first > layerMax) )
0051 continue;
0052 avLayer += ithLayer->second.avX*ithLayer->second.energy;
0053 totE += ithLayer->second.energy;
0054 }
0055 avLayer = avLayer/totE;
0056 return avLayer;
0057 }
0058
0059 inline double GetYAverage(std::map<int,Layer> layers, int layerMax = -100){
0060 double avLayer = 0;
0061 double totE = 0;
0062 std::map<int, Layer>::iterator ithLayer;
0063 for(ithLayer=layers.begin(); ithLayer!=layers.end(); ++ithLayer){
0064 if ( (layerMax !=-100) && (ithLayer->first > layerMax) )
0065 continue;
0066 avLayer += ithLayer->second.avY*ithLayer->second.energy;
0067 totE += ithLayer->second.energy;
0068 }
0069 avLayer = avLayer/totE;
0070 return avLayer;
0071 }
0072
0073 struct RunInfo{
0074 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) {}
0075 int runNr;
0076 TString species;
0077 int pdg;
0078 float energy;
0079 float vop;
0080 float vbr;
0081 int lgSet;
0082 int hgSet;
0083 float posX;
0084 float posY;
0085 float shapetime;
0086 int assemblyNr;
0087 int year;
0088 int month;
0089 TString readout;
0090 TString facility;
0091 TString beamline;
0092 int samples;
0093 int trigDelay;
0094 int trigDead;
0095 int phase;
0096 } ;
0097
0098 TString GetStringFromRunInfo(RunInfo, Int_t);
0099
0100
0101
0102
0103
0104 inline std::map<int,RunInfo> readRunInfosFromFile(TString runListFileName, int debug, int specialData = 0 ){
0105 std::map<int,RunInfo> runs;
0106
0107 std::ifstream runListFile;
0108 runListFile.open(runListFileName,std::ios_base::in);
0109 if (!runListFile) {
0110 std::cout << "ERROR: file " << runListFileName.Data() << " not found!" << std::endl;
0111 return runs;
0112 }
0113
0114 TString facility="";
0115 TString beamline="";
0116 TString readout="";
0117 int year = -1;
0118 int month = -1;
0119 for( TString tempLine; tempLine.ReadLine(runListFile, kTRUE); ) {
0120
0121 if (tempLine.BeginsWith("%") || tempLine.BeginsWith("#")){
0122 continue;
0123 }
0124 if (debug > 1) std::cout << tempLine.Data() << std::endl;
0125
0126 TObjArray *tempArr2 = tempLine.Tokenize(" ");
0127 if(tempArr2->GetEntries()>0){
0128 if (tempLine.BeginsWith("year")){
0129 year=((TString)((TObjString*)tempArr2->At(1))->GetString()).Atoi();
0130 continue;
0131 } else if (tempLine.BeginsWith("month")){
0132 month=((TString)((TObjString*)tempArr2->At(1))->GetString()).Atoi();
0133 continue;
0134 } else if (tempLine.BeginsWith("readout")){
0135 readout=((TString)((TObjString*)tempArr2->At(1))->GetString());
0136 continue;
0137 } else if (tempLine.BeginsWith("facility")){
0138 facility=((TString)((TObjString*)tempArr2->At(1))->GetString());
0139 continue;
0140 } else if (tempLine.BeginsWith("beam-line")){
0141 beamline=((TString)((TObjString*)tempArr2->At(1))->GetString());
0142 continue;
0143 }
0144 }
0145
0146 TObjArray *tempArr = tempLine.Tokenize(",");
0147 if(tempArr->GetEntries()<1){
0148 if (debug > 1) std::cout << "nothing to be done" << std::endl;
0149 delete tempArr;
0150 continue;
0151 }
0152
0153
0154 RunInfo tempRun;
0155 tempRun.facility= facility;
0156 tempRun.beamline= beamline;
0157 tempRun.readout = readout;
0158 tempRun.year = year;
0159 tempRun.month = month;
0160 tempRun.runNr = ((TString)((TObjString*)tempArr->At(0))->GetString()).Atoi();
0161 tempRun.species = (TString)((TObjString*)tempArr->At(1))->GetString();
0162 tempRun.pdg = ((TString)((TObjString*)tempArr->At(2))->GetString()).Atoi();
0163 tempRun.energy = ((TString)((TObjString*)tempArr->At(3))->GetString()).Atof();
0164 tempRun.vop = ((TString)((TObjString*)tempArr->At(4))->GetString()).Atof();
0165 tempRun.vbr = ((TString)((TObjString*)tempArr->At(5))->GetString()).Atof();
0166
0167 if (readout.CompareTo("CAEN") == 0){
0168 tempRun.hgSet = ((TString)((TObjString*)tempArr->At(6))->GetString()).Atoi();
0169 tempRun.lgSet = ((TString)((TObjString*)tempArr->At(7))->GetString()).Atoi();
0170 if (tempArr->GetEntries() > 10){
0171 tempRun.shapetime = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atof();
0172 }
0173 } else {
0174 tempRun.trigDelay = ((TString)((TObjString*)tempArr->At(6))->GetString()).Atoi();
0175 tempRun.samples = ((TString)((TObjString*)tempArr->At(7))->GetString()).Atoi();
0176 tempRun.trigDead = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atoi();
0177 tempRun.phase = ((TString)((TObjString*)tempArr->At(11))->GetString()).Atoi();
0178 }
0179 tempRun.posX = ((TString)((TObjString*)tempArr->At(8))->GetString()).Atoi();
0180 tempRun.posY = ((TString)((TObjString*)tempArr->At(9))->GetString()).Atoi();
0181 if (specialData == 1) tempRun.assemblyNr = ((TString)((TObjString*)tempArr->At(10))->GetString()).Atoi();
0182
0183 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;
0184 runs[tempRun.runNr]=tempRun;
0185 }
0186 std::cout << year << "-" << month << "\t:\t" << facility.Data() << "-" << beamline.Data() << "\t Readout: " << readout.Data() << std::endl;
0187 std::cout << "registered " << runs.size() << " runs from "<< runListFileName.Data() << std::endl;
0188
0189 return runs;
0190 };
0191
0192 inline int GetSpeciesIntFromRunInfo(RunInfo currRunInfo){
0193 if (currRunInfo.species.Contains("cosmics")){
0194 return 0;
0195 } else if (currRunInfo.species.CompareTo("g") == 0){
0196 return 1;
0197 } else if (currRunInfo.species.Contains("muon") || currRunInfo.species.Contains("Muon") || currRunInfo.species.CompareTo("mu-") == 0){
0198 return 2;
0199 } else if (currRunInfo.species.Contains("Electron") || currRunInfo.species.Contains("electron") || currRunInfo.species.CompareTo("e-") == 0 ){
0200 return 3;
0201 } else if (currRunInfo.species.Contains("Pion") || currRunInfo.species.Contains("pion") || currRunInfo.species.CompareTo("pi-") == 0 || currRunInfo.species.CompareTo("pi+") == 0 ){
0202 return 4;
0203 } else if (currRunInfo.species.Contains("Hadron") || currRunInfo.species.Contains("hadron") || currRunInfo.species.CompareTo("h+") == 0 || currRunInfo.species.CompareTo("h-") == 0 ){
0204 return 5;
0205 }
0206
0207 return -1;
0208 }
0209
0210 inline Double_t ReturnMipPlotRangeDepVov(double Vov, bool isHG){
0211 if (isHG){
0212 if (Vov < 2)
0213 return 550.;
0214 else if (Vov < 3)
0215 return 750.;
0216 else if (Vov < 4)
0217 return 950.;
0218 else if (Vov < 5)
0219 return 1150.;
0220 else
0221 return 1350.;
0222 } else {
0223 if (Vov < 2)
0224 return 85.;
0225 else if (Vov < 3)
0226 return 105.;
0227 else if (Vov < 4)
0228 return 125.;
0229 else if (Vov < 5)
0230 return 145.;
0231 else
0232 return 165.;
0233 }
0234 }
0235
0236
0237
0238
0239 #endif