Example #1
0
  static Bool_t is_in_eta_fiducial(const TVector3 &pos) {
    // converted from emid::is_in_eta_fiducial

    // NOTE: this routine assumes pos is in local coordinates!
    //convert pos to local coordinate system
    //TVector3 v = toLocal(pos);

    // cryostat edges
    bool is_at_edge;
    if (TMath::Abs(pos.Z())>150.) {
      is_at_edge=pos.Perp()>EC_R_MAX;
    } else {
      is_at_edge=fabs(pos.Z())>CC_Z_MAX;
    }
    return (!is_at_edge);
    
  }
////////////////////////////////////////////////////////////////////////////////////
//Missing momentum vector histo filling/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void TrigGlobalBranch::FillMissMomHistos(){
	
	TVector3 lvSumTemp;
	int imom, icent;
	float centralityTemp = -1.; 
	centralityTemp = AssignCentrality(Fcal_Et);
	icent = indexCentrality(centralityTemp);

	imom = 0;
	lvSumTemp = MissMom(500.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(700.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(1000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(2000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());


	++imom;
	lvSumTemp = MissMom(3000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(4000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(5000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(6000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(7000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(10000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

	++imom;
	lvSumTemp = MissMom(15000.0);
	hMissPt[imom]->Fill(lvSumTemp.Perp());
	hMissPx[imom]->Fill(lvSumTemp.Px());
	hMissPy[imom]->Fill(lvSumTemp.Py());
	hMissPtCent[imom][icent]->Fill(lvSumTemp.Perp());
	hMissPxCent[imom][icent]->Fill(lvSumTemp.Px());
	hMissPyCent[imom][icent]->Fill(lvSumTemp.Py());

        	
}
int
QAG4SimulationCalorimeter::process_event_G4Hit(PHCompositeNode *topNode)
{

  if (verbosity > 2)
    cout << "QAG4SimulationCalorimeter::process_event_G4Hit() entered" << endl;

  TH1F* h = nullptr;

  Fun4AllHistoManager *hm = QAHistManagerDef::getHistoManager();
  assert(hm);

  TH1D* h_norm = dynamic_cast<TH1D*>(hm->getHisto(
      get_histo_prefix() + "_Normalization"));
  assert(h_norm);

  // get primary
  assert(_truth_container);
  PHG4TruthInfoContainer::ConstRange primary_range =
      _truth_container->GetPrimaryParticleRange();
  double total_primary_energy = 1e-9; //make it zero energy epsilon samll so it can be used for denominator
  for (PHG4TruthInfoContainer::ConstIterator particle_iter = primary_range.first;
      particle_iter != primary_range.second; ++particle_iter)
    {
      const PHG4Particle *particle = particle_iter->second;
      assert(particle);
      total_primary_energy += particle->get_e();
    }

  assert(not _truth_container->GetMap().empty());
  const PHG4Particle * last_primary =
      _truth_container->GetMap().rbegin()->second;
  assert(last_primary);

  if (verbosity > 2)
    {
      cout
          << "QAG4SimulationCalorimeter::process_event_G4Hit() handle this truth particle"
          << endl;
      last_primary->identify();
    }
  const PHG4VtxPoint* primary_vtx = //
      _truth_container->GetPrimaryVtx(last_primary->get_vtx_id());
  assert(primary_vtx);
  if (verbosity > 2)
    {
      cout
          << "QAG4SimulationCalorimeter::process_event_G4Hit() handle this vertex"
          << endl;
      primary_vtx->identify();
    }

  const double t0 = primary_vtx->get_t();
  const TVector3 vertex(primary_vtx->get_x(), primary_vtx->get_y(),
      primary_vtx->get_z());

  // projection axis
  TVector3 axis_proj(last_primary->get_px(), last_primary->get_py(),
      last_primary->get_pz());
  if (axis_proj.Mag() == 0)
    axis_proj.SetXYZ(0, 0, 1);
  axis_proj = axis_proj.Unit();

  // azimuthal direction axis
  TVector3 axis_azimuth = axis_proj.Cross(TVector3(0, 0, 1));
  if (axis_azimuth.Mag() == 0)
    axis_azimuth.SetXYZ(1, 0, 0);
  axis_azimuth = axis_azimuth.Unit();

  // polar direction axis
  TVector3 axis_polar = axis_proj.Cross(axis_azimuth);
  assert(axis_polar.Mag() > 0);
  axis_polar = axis_polar.Unit();

  double e_calo = 0.0; // active energy deposition
  double ev_calo = 0.0; // visible energy
  double ea_calo = 0.0; // absorber energy
  double ev_calo_em = 0.0; // EM visible energy

  if (_calo_hit_container)
    {
      TH2F * hrz = dynamic_cast<TH2F*>(hm->getHisto(
          get_histo_prefix() + "_G4Hit_RZ"));
      assert(hrz);
      TH2F * hxy = dynamic_cast<TH2F*>(hm->getHisto(
          get_histo_prefix() + "_G4Hit_XY"));
      assert(hxy);
      TH1F * ht = dynamic_cast<TH1F*>(hm->getHisto(
          get_histo_prefix() + "_G4Hit_HitTime"));
      assert(ht);
      TH2F * hlat = dynamic_cast<TH2F*>(hm->getHisto(
          get_histo_prefix() + "_G4Hit_LateralTruthProjection"));
      assert(hlat);

      h_norm->Fill("G4Hit Active", _calo_hit_container->size());
      PHG4HitContainer::ConstRange calo_hit_range =
          _calo_hit_container->getHits();
      for (PHG4HitContainer::ConstIterator hit_iter = calo_hit_range.first;
          hit_iter != calo_hit_range.second; hit_iter++)
        {

          PHG4Hit *this_hit = hit_iter->second;
          assert(this_hit);

          e_calo += this_hit->get_edep();
          ev_calo += this_hit->get_light_yield();

          // EM visible energy that is only associated with electron energy deposition
          PHG4Particle* particle = _truth_container->GetParticle(
              this_hit->get_trkid());
          if (!particle)
            {
              cout <<__PRETTY_FUNCTION__<<" - Error - this PHG4hit missing particle: "; this_hit -> identify();
            }
          assert(particle);
          if (abs(particle->get_pid()) == 11)
            ev_calo_em += this_hit->get_light_yield();

          const TVector3 hit(this_hit->get_avg_x(), this_hit->get_avg_y(),
              this_hit->get_avg_z());

          hrz->Fill(hit.Z(), hit.Perp(), this_hit->get_edep());
          hxy->Fill(hit.X(), hit.Y(), this_hit->get_edep());
          ht->Fill(this_hit->get_avg_t() - t0, this_hit->get_edep());

          const double hit_azimuth = axis_azimuth.Dot(hit - vertex);
          const double hit_polar = axis_polar.Dot(hit - vertex);
          hlat->Fill(hit_polar, hit_azimuth, this_hit->get_edep());
        }
    }

  if (_calo_abs_hit_container)
    {

      h_norm->Fill("G4Hit Absor.", _calo_abs_hit_container->size());

      PHG4HitContainer::ConstRange calo_abs_hit_range =
          _calo_abs_hit_container->getHits();
      for (PHG4HitContainer::ConstIterator hit_iter = calo_abs_hit_range.first;
          hit_iter != calo_abs_hit_range.second; hit_iter++)
        {

          PHG4Hit *this_hit = hit_iter->second;
          assert(this_hit);

          ea_calo += this_hit->get_edep();

        }
    }

  if (verbosity > 3)
    cout << "QAG4SimulationCalorimeter::process_event_G4Hit::" << _calo_name
        << " - SF = " << e_calo / (e_calo + ea_calo + 1e-9) << ", VSF = "
        << ev_calo / (e_calo + ea_calo + 1e-9) << endl;

  if (e_calo + ea_calo > 0)
    {
      h = dynamic_cast<TH1F*>(hm->getHisto(get_histo_prefix() + "_G4Hit_SF"));
      assert(h);
      h->Fill(e_calo / (e_calo + ea_calo));

      h = dynamic_cast<TH1F*>(hm->getHisto(get_histo_prefix() + "_G4Hit_VSF"));
      assert(h);
      h->Fill(ev_calo / (e_calo + ea_calo));
    }

  h = dynamic_cast<TH1F*>(hm->getHisto(
      get_histo_prefix() + "_G4Hit_FractionTruthEnergy"));
  assert(h);
  h->Fill((e_calo + ea_calo) / total_primary_energy);

  if (ev_calo > 0)
    {
      h = dynamic_cast<TH1F*>(hm->getHisto(
          get_histo_prefix() + "_G4Hit_FractionEMVisibleEnergy"));
      assert(h);
      h->Fill(ev_calo_em / (ev_calo));
    }

  if (verbosity > 3)
    cout << "QAG4SimulationCalorimeter::process_event_G4Hit::" << _calo_name
        << " - histogram " << h->GetName() << " Get Sum = " << h->GetSum()
        << endl;

  return Fun4AllReturnCodes::EVENT_OK;
}