Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-17 09:24:39

0001 #include <cmath>
0002 #include <fstream>
0003 #include <iostream>
0004 #include <string>
0005 #include <vector>
0006 
0007 #include "ROOT/RDataFrame.hxx"
0008 #include <TH1D.h>
0009 #include <TH2D.h>
0010 #include <TRandom3.h>
0011 #include <TFile.h>
0012 #include <TChain.h>
0013 #include <TTree.h>
0014 #include <TMath.h>
0015 #include <TVector3.h>
0016 #include <TCanvas.h>
0017 
0018 #include "TROOT.h"
0019 #include "TRandom.h"
0020 #include "TH3.h"
0021 
0022 #include "TStyle.h"
0023 
0024 #include "DD4hep/Detector.h"
0025 #include "DDRec/CellIDPositionConverter.h"
0026 
0027 #include <podio/Frame.h>
0028 #include <podio/CollectionBase.h>
0029 #include "podio/ROOTReader.h"
0030 //#include <podio/ROOTFrameReader.h>
0031 #include "podio/CollectionIDTable.h"
0032 #include "podio/ObjectID.h"
0033 
0034 #include "edm4hep/MCParticleCollection.h"
0035 #include "edm4hep/MCParticleCollectionData.h"
0036 #include "edm4hep/MCParticle.h"
0037 #include "edm4hep/MCParticleData.h"
0038 
0039 #include "edm4hep/SimCalorimeterHitCollectionData.h"
0040 #include "edm4hep/SimCalorimeterHitCollection.h"
0041 #include "edm4hep/SimCalorimeterHitData.h"
0042 #include "edm4hep/SimCalorimeterHit.h"
0043 
0044 #include "edm4hep/CalorimeterHit.h"
0045 #include "edm4hep/CalorimeterHitCollectionData.h"
0046 #include "edm4hep/CalorimeterHitCollection.h"
0047 #include "edm4hep/CalorimeterHitData.h"
0048 #include "edm4hep/CalorimeterHit.h"
0049 #include "edm4hep/CalorimeterHitObj.h"
0050 
0051 #include "edm4eic/ClusterCollection.h"
0052 #include "edm4eic/Cluster.h"
0053 #include "edm4eic/ClusterData.h"
0054 
0055 #include "edm4eic/CalorimeterHit.h"
0056 #include "edm4eic/CalorimeterHitCollectionData.h"
0057 #include "edm4eic/CalorimeterHitCollection.h"
0058 #include "edm4eic/CalorimeterHitData.h"
0059 #include "edm4eic/CalorimeterHit.h"
0060 #include "edm4eic/CalorimeterHitObj.h"
0061 
0062 
0063 #include <edm4eic/vector_utils_legacy.h>
0064 #include <edm4hep/Vector3f.h>
0065 
0066 // #include "FileList.h"
0067 // #include "EICutil.h"
0068 // #include "BasicUtil.h"
0069 
0070 // #pragma link C++ class vector<edm4hep::MCParticleData>+;
0071 // #pragma link C++ class vector<podio::ObjectID>+;
0072 // #pragma link C++ class vector<edm4hep::SimCalorimeterHitData>+;
0073 
0074 using namespace std;
0075 using namespace ROOT;
0076 using namespace TMath;
0077 using namespace edm4hep;
0078 
0079 int basic_distribution_analysis(const string &filename, string outname_pdf, string outname_png) 
0080 {
0081     podio::ROOTReader *reader = new podio::ROOTReader();
0082     reader->openFile(filename);
0083     unsigned nEvents = reader->getEntries("events");
0084     cout << "Number of events: " << nEvents << endl;
0085 
0086     vector<double> xPosition;
0087     vector<double> yPosition;
0088     vector<double> zPosition;
0089     vector<double> rPosition;
0090     vector<double> energy;
0091     vector<double> totalEventEnergy;
0092     vector<double> totalEventHits;
0093     vector<double> zLayerValues;
0094     vector<int> nHitsPerLayer;
0095     vector<double> nEnergyPerLayer;
0096     
0097     for (unsigned ev = 0; ev < nEvents; ev++) 
0098     {
0099         auto frameData = reader->readNextEntry(podio::Category::Event);
0100         if (!frameData) 
0101         {
0102             cerr << "Invalid FrameData at event " << ev << endl;
0103             continue;
0104         }
0105 
0106         podio::Frame frame(std::move(frameData));
0107 
0108         auto& hits = frame.get<edm4hep::SimCalorimeterHitCollection>("HcalEndcapNHits");
0109         if (!hits.isValid())    
0110         {
0111             cerr << "HcalEndcapNHits collection is not valid!" << endl;
0112         }
0113 
0114         map<double, pair<int, double>> layerData;
0115         double totalEnergy = 0;
0116         int totalHits = 0;
0117 
0118         for (const auto& hit : hits) 
0119         {
0120             totalHits++;
0121             energy.push_back(hit.getEnergy());
0122             totalEnergy += hit.getEnergy();
0123 
0124             auto pos = hit.getPosition();
0125             xPosition.push_back(pos.x);
0126             yPosition.push_back(pos.y);
0127             zPosition.push_back(pos.z);
0128             rPosition.push_back(sqrt(pos.x * pos.x + pos.y * pos.y));
0129 
0130             double zBin = round(pos.z);
0131             layerData[zBin].first++;         
0132             layerData[zBin].second += hit.getEnergy();
0133         }
0134 
0135         totalEventEnergy.push_back(totalEnergy);
0136         totalEventHits.push_back(totalHits);
0137 
0138         for (const auto& [zValue, stats] : layerData)
0139         {
0140             zLayerValues.push_back(zValue);
0141             nHitsPerLayer.push_back(stats.first);
0142             nEnergyPerLayer.push_back(stats.second);
0143         }
0144 
0145     }
0146 
0147     auto minmax_xPosition        = minmax_element(xPosition.begin(), xPosition.end());
0148     auto minmax_yPosition        = minmax_element(yPosition.begin(), yPosition.end());
0149     auto minmax_zPosition        = minmax_element(zPosition.begin(), zPosition.end());
0150     auto minmax_rPosition        = minmax_element(rPosition.begin(), rPosition.end());
0151     auto minmax_totalEventEnergy = minmax_element(totalEventEnergy.begin(), totalEventEnergy.end());
0152     auto minmax_totalEventHits   = minmax_element(totalEventHits.begin(), totalEventHits.end());
0153     auto minmax_energy           = minmax_element(energy.begin(), energy.end());
0154     auto minmax_zLayerValues     = minmax_element(zLayerValues.begin(), zLayerValues.end());
0155     auto minmax_nHitsPerLayer    = minmax_element(nHitsPerLayer.begin(), nHitsPerLayer.end());
0156     auto minmax_nEnergyPerLayer  = minmax_element(nEnergyPerLayer.begin(), nEnergyPerLayer.end());
0157 
0158     int nbins = nEvents/1000;
0159 
0160     TH1D *h_energyTotal = new TH1D("h_energyTotal", "Total Energy per Event; Energy per Event", 
0161                                     nbins/2, *minmax_totalEventEnergy.first, *minmax_totalEventEnergy.second);
0162     TH2D *h_layerEnergy = new TH2D("h_layerEnergy", "Energy in Layers (Z); Z; Energy", 
0163                                     nbins/5, *minmax_zLayerValues.first, *minmax_zLayerValues.second, 
0164                                     nbins/4, *minmax_nEnergyPerLayer.first, *minmax_nEnergyPerLayer.second);
0165     TProfile *p_layerEnergy = new TProfile("p_layerEnergy", "Energy in Layers (Z); Z; Mean Energy",
0166                                     nbins/5, *minmax_zLayerValues.first, *minmax_zLayerValues.second);
0167     TH1D *h_hitCount    = new TH1D("h_hitCount", "Number of Hits per Event; Hits per Event", 
0168                                     nbins/2, *minmax_totalEventHits.first, *minmax_totalEventHits.second);
0169     TH2D *h_layerHits   = new TH2D("h_layerHits", "Number of Hits in Layers (Z); Layer(Z); Hits", 
0170                                     nbins/5, *minmax_zLayerValues.first, *minmax_zLayerValues.second, 
0171                                     *minmax_nHitsPerLayer.second, *minmax_nHitsPerLayer.first, *minmax_nHitsPerLayer.second);
0172     TProfile *p_layerHits = new TProfile("p_layerHits", "Number of Hits in Layers (Z); Z; Mean Hits",
0173                                     nbins/5, *minmax_zLayerValues.first, *minmax_zLayerValues.second);
0174     TH2D *h_XYPos       = new TH2D("h_XYPos", "Hits position X,Y;X [mm];Y [mm]", 
0175                                     nbins, *minmax_xPosition.first, *minmax_xPosition.second, 
0176                                     nbins, *minmax_yPosition.first, *minmax_yPosition.second);
0177     TH2D *h_ZRPos       = new TH2D("h_ZRPos", "Hits position Z,R;Z [mm];R [mm]", 
0178                                     nbins/5, *minmax_zPosition.first, *minmax_zPosition.second, 
0179                                     nbins, *minmax_rPosition.first, *minmax_rPosition.second);
0180     TH2D *h_XYEnergy    = new TH2D("h_XYEnergy", "Hits energy X,Y;X [mm];Y [mm]", 
0181                                     nbins, *minmax_xPosition.first, *minmax_xPosition.second, 
0182                                     nbins, *minmax_yPosition.first, *minmax_yPosition.second);
0183 
0184     for(int i = 0; i < xPosition.size(); i++)
0185     {
0186         
0187         h_XYPos->Fill(xPosition[i], yPosition[i]);
0188         h_ZRPos->Fill(zPosition[i], rPosition[i]);
0189         h_XYEnergy->Fill(xPosition[i], yPosition[i], energy[i]);
0190     }
0191 
0192     for (int i = 0; i < zLayerValues.size(); i++)
0193     {
0194         h_layerHits->Fill(zLayerValues[i], nHitsPerLayer[i]);
0195         p_layerHits->Fill(zLayerValues[i], nHitsPerLayer[i]);
0196 
0197         h_layerEnergy->Fill(zLayerValues[i], nEnergyPerLayer[i]);
0198         p_layerEnergy->Fill(zLayerValues[i], nEnergyPerLayer[i]);
0199     }
0200 
0201     for(int i = 0; i < nEvents; i++)
0202     {
0203         h_energyTotal->Fill(totalEventEnergy[i]);
0204         h_hitCount->Fill(totalEventHits[i]);
0205     }
0206 
0207     gStyle->SetPadLeftMargin(0.13);
0208 
0209     TCanvas *canvas = new TCanvas("canvas", "canvas", 1600, 800);
0210     canvas->Divide(4,2);
0211     canvas->cd(1);
0212     h_energyTotal->Draw();
0213     canvas->cd(2);
0214     h_layerEnergy->Draw("COLZ");
0215     p_layerEnergy->Draw("SAME");
0216     canvas->cd(3);
0217     h_hitCount->Draw();
0218     canvas->cd(4);
0219     h_layerHits->Draw("COLZ");
0220     p_layerHits->Draw("SAME");
0221     canvas->cd(5);
0222     h_XYPos->Draw("COLZ");
0223     canvas->cd(6);
0224     h_ZRPos->Draw("COLZ");
0225     canvas->cd(7);
0226     h_XYEnergy->Draw("COLZ");
0227 
0228     canvas->SaveAs(outname_pdf.c_str());
0229     canvas->SaveAs(outname_png.c_str());
0230 
0231     return 0;
0232 }