File indexing completed on 2025-08-14 08:14:26
0001 #include "laserQA.h"
0002
0003 #include <trackbase/LaserClusterContainerv1.h>
0004 #include <trackbase/LaserClusterv1.h>
0005 #include <trackbase/TpcDefs.h>
0006 #include <trackbase/TrkrDefs.h>
0007
0008 #include <ffaobjects/EventHeader.h>
0009
0010 #include <fun4all/Fun4AllReturnCodes.h>
0011
0012 #include <phool/PHCompositeNode.h>
0013 #include <phool/getClass.h>
0014 #include <phool/phool.h>
0015
0016 #include <TFile.h>
0017 #include <TH1.h>
0018 #include <TH2.h>
0019 #include <TVector3.h>
0020
0021 #include <string>
0022
0023
0024
0025 laserQA::laserQA(const std::string& name)
0026 : SubsysReco(name)
0027 {
0028 }
0029
0030 int laserQA::InitRun(PHCompositeNode* topNode)
0031 {
0032
0033 m_nLaserEvents = new TH1D("nLaserEvents","Number of Laser Events",1,0.5,1.5);
0034
0035 double rBinEdges[5] = {0.0, 0.256, 0.504, 0.752, 1.0};
0036
0037 for(int side=0; side<2; side++){
0038 m_TPCWheel[side] = new TH2D(Form("TPCWheel_%s",(side == 1 ? "North" : "South")),Form("Laser Hit ADC per event %s",(side == 1 ? "North" : "South")),12,-TMath::Pi()/12.,23.*TMath::Pi()/12.,4,rBinEdges);
0039 }
0040
0041 return Fun4AllReturnCodes::EVENT_OK;
0042
0043 }
0044
0045
0046 int laserQA::process_event(PHCompositeNode* topNode)
0047 {
0048
0049 EventHeader *eventHeader = findNode::getClass<EventHeader>(topNode, "EventHeader");
0050 if(!eventHeader)
0051 {
0052 std::cout << PHWHERE << " EventHeader Node missing, abort" << std::endl;
0053 return Fun4AllReturnCodes::ABORTRUN;
0054 }
0055
0056 LaserClusterContainer *lcc = findNode::getClass<LaserClusterContainer>(topNode, "LASER_CLUSTER");
0057 if (!lcc)
0058 {
0059 std::cout << PHWHERE << "LASER_CLUSTER Node missing, abort." << std::endl;
0060 return Fun4AllReturnCodes::ABORTRUN;
0061 }
0062
0063
0064 std::cout << "working on event " << eventHeader->get_EvtSequence() << std::endl;
0065
0066 if(lcc->size() < 1000) return Fun4AllReturnCodes::EVENT_OK;
0067
0068 m_nLaserEvents->Fill(1.0);
0069
0070 auto clusrange = lcc->getClusters();
0071 for (auto cmitr = clusrange.first;
0072 cmitr != clusrange.second;
0073 ++cmitr)
0074 {
0075 const auto& [cmkey, cmclus_orig] = *cmitr;
0076 LaserCluster* cmclus = cmclus_orig;
0077 int side = TpcDefs::getSide(cmkey);
0078
0079 const unsigned int nhits = cmclus->getNhits();
0080 for (unsigned int i=0; i<nhits; i++){
0081 float layer = cmclus->getHitLayer(i);
0082 float hitAdc = cmclus->getHitAdc(i);
0083
0084 double phi = atan2(cmclus->getHitY(i), cmclus->getHitX(i));
0085 if(phi < -TMath::Pi()/12.) phi += 2*TMath::Pi();
0086
0087 int mod = -1;
0088 double RValue = -999;
0089 if(layer >= 7 && layer <= 22){
0090 mod = 0;
0091 RValue = 0.4;
0092 }
0093 else if(layer >= 23 && layer <= 38){
0094 mod = 1;
0095 RValue = 0.6;
0096 }
0097 else if(layer >= 39 && layer <= 54){
0098 mod = 2;
0099 RValue = 0.8;
0100 }
0101
0102 if(mod == -1) continue;
0103
0104 m_TPCWheel[side]->Fill(phi, RValue, hitAdc);
0105
0106 }
0107
0108
0109 }
0110
0111 return Fun4AllReturnCodes::EVENT_OK;
0112 }
0113
0114 int laserQA::End(PHCompositeNode* )
0115 {
0116 TFile *outfile = new TFile(m_output.c_str(),"RECREATE");
0117 outfile->cd();
0118
0119 m_nLaserEvents->Write();
0120 for(int side=0; side<2; side++){
0121 m_TPCWheel[side]->Write();
0122 }
0123
0124 outfile->Close();
0125
0126 return Fun4AllReturnCodes::EVENT_OK;
0127 }