Back to home page

EIC code displayed by LXR

 
 

    


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;  // 0: low, 1: high, 2:2.5V
0107     int injDAC;
0108   } ;
0109 
0110   TString GetStringFromRunInfo(RunInfo, Int_t);
0111 
0112   //__________________________________________________________________________________________________________
0113   //__________________ Read run infos from text file _________________________________________________________
0114   //__________________________________________________________________________________________________________    
0115   // specialData: 0 - std. TB, 1 - SPE data ORNL
0116   inline std::map<int,RunInfo> readRunInfosFromFile(TString runListFileName, int debug, int specialData = 0 ){
0117     std::map<int,RunInfo> runs;
0118     //std::cout << "INFO: You have given the following run list file: " << runListFileName.Data() << std::endl;
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       // check if line should be considered
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       // Separate the string according to tabulators
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       // Put them to the correct variables    
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       // normal run 
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       // injection tests
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; // cosmics
0246       } else if (currRunInfo.species.CompareTo("g") == 0){
0247           return  1; // gamma
0248       } else if (currRunInfo.species.Contains("muon") || currRunInfo.species.Contains("Muon") || currRunInfo.species.CompareTo("mu-") == 0){
0249           return  2; // muon
0250       } else if (currRunInfo.species.Contains("Electron") || currRunInfo.species.Contains("electron") || currRunInfo.species.CompareTo("e-") == 0 ){
0251           return  3; // electron
0252       } else if (currRunInfo.species.Contains("Positron") || currRunInfo.species.Contains("positron") || currRunInfo.species.CompareTo("e+") == 0 ){
0253           return  6; // positron
0254       } else if (currRunInfo.species.Contains("Pion") || currRunInfo.species.Contains("pion") || currRunInfo.species.CompareTo("pi-") == 0 || currRunInfo.species.CompareTo("pi+") == 0 ){
0255           return  4; // pion
0256       } else if (currRunInfo.species.Contains("Hadron") || currRunInfo.species.Contains("hadron") || currRunInfo.species.CompareTo("h+") == 0 || currRunInfo.species.CompareTo("h-") == 0 ){
0257           return  5; // hadron/proton
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   // // Function to generate the CRC-32 lookup table at runtime (or compile time with C++11 constexpr)
0454   // void generate_crc32_table(uint32_t(&table)[256]) {
0455   //     uint32_t polynomial = 0x104C11DB7; // Common CRC-32 polynomial
0456   //     for (uint32_t i = 0; i < 256; i++) {
0457   //         uint32_t c = i;
0458   //         for (size_t j = 0; j < 8; j++) {
0459   //             if (c & 1) {
0460   //                 c = polynomial ^ (c >> 1);
0461   //             } else {
0462   //                 c >>= 1;
0463   //             }
0464   //         }
0465   //         table[i] = c;
0466   //     }
0467   // }
0468   // 
0469   // // Function to calculate the CRC-32 checksum for a buffer
0470   // uint32_t calculate_crc32(const uint8_t* data, size_t length) {
0471   //     uint32_t crc = 0x0;           // Initial value (standard for HGCROC)
0472   //     // uint32_t crc = 0xFFFFFFFF; // Initial value (standard for CRC-32)
0473   //     uint32_t table[256];
0474   //     generate_crc32_table(table);
0475   // 
0476   //     for (size_t i = 0; i < length; ++i) {
0477   //         crc = table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);
0478   //     }
0479   // 
0480   //     return crc ^ 0xFFFFFFFF; // Final XOR (standard for CRC-32)
0481   // }  
0482 
0483   // Usage CRC
0484   // std::string message = "123456789"; // Standard test string for CRC-32 check value
0485   // The expected CRC-32 result for this string is 0xCBF43926
0486   //  uint32_t checksum = calculate_crc32(reinterpret_cast<const uint8_t*>(message.c_str()), message.length());
0487   //  std::cout << "CRC-32 Checksum: 0x" << std::hex << std::uppercase << checksum << std::endl;
0488 
0489   
0490 #endif