Back to home page

sPhenix code displayed by LXR

 
 

    


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* /*topNode*/)
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 }