Back to home page

EIC code displayed by LXR

 
 

    


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   //__________________ Read run infos from text file _________________________________________________________
0102   //__________________________________________________________________________________________________________    
0103   // specialData: 0 - std. TB, 1 - SPE data ORNL
0104   inline std::map<int,RunInfo> readRunInfosFromFile(TString runListFileName, int debug, int specialData = 0 ){
0105     std::map<int,RunInfo> runs;
0106     //std::cout << "INFO: You have given the following run list file: " << runListFileName.Data() << std::endl;
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       // check if line should be considered
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       // Separate the string according to tabulators
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       // Put them to the correct variables    
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; // cosmics
0195       } else if (currRunInfo.species.CompareTo("g") == 0){
0196           return  1; // gamma
0197       } else if (currRunInfo.species.Contains("muon") || currRunInfo.species.Contains("Muon") || currRunInfo.species.CompareTo("mu-") == 0){
0198           return  2; // muon
0199       } else if (currRunInfo.species.Contains("Electron") || currRunInfo.species.Contains("electron") || currRunInfo.species.CompareTo("e-") == 0 ){
0200           return  3; // electron
0201       } else if (currRunInfo.species.Contains("Pion") || currRunInfo.species.Contains("pion") || currRunInfo.species.CompareTo("pi-") == 0 || currRunInfo.species.CompareTo("pi+") == 0 ){
0202           return  4; // pion
0203       } else if (currRunInfo.species.Contains("Hadron") || currRunInfo.species.Contains("hadron") || currRunInfo.species.CompareTo("h+") == 0 || currRunInfo.species.CompareTo("h-") == 0 ){
0204           return  5; // hadron/proton
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