示例#1
0
文件: testlor.C 项目: geparask/Thesis
void testlor::Loop()
{
//   In a ROOT session, you can do:
//      Root > .L testlor.C
//      Root > testlor t
//      Root > t.GetEntry(12); // Fill t data members with entry number 12
//      Root > t.Show();       // Show values of entry 12
//      Root > t.Show(16);     // Read and show values of entry 16
//      Root > t.Loop();       // Loop on all entries
//

//     This is the loop skeleton where:
//    jentry is the global entry number in the chain
//    ientry is the entry number in the current Tree
//  Note that the argument to GetEntry must be:
//    jentry for TChain::GetEntry
//    ientry for TTree::GetEntry and TBranch::GetEntry
//
//       To read only selected branches, Insert statements like:
// METHOD1:
//    fChain->SetBranchStatus("*",0);  // disable all branches
//    fChain->SetBranchStatus("branchname",1);  // activate branchname
// METHOD2: replace line
//    fChain->GetEntry(jentry);       //read all branches
//by  b_branchname->GetEntry(ientry); //read only this branch

//Set-up Code
	if (fChain == 0) return;

	Long64_t nentries = fChain->GetEntriesFast();

	Long64_t nbytes = 0, nb = 0;
	int pions=0,kaons=0,ksTOpi=0,i=0,j=0;
	int ipart1,ipart2,a,b;
	Double_t ppion[kMaxentry];
	Double_t npion[kMaxentry];
	Double_t p[kMaxentry];
	double prop=0;
	Double_t pp,E,KSmass;
   	TLorentzVector q[kMaxentry];//pinakas tupou tlorentz
	TLorentzVector w,v; 
	TVector3 l;
	
	TH1D *pzhist=new TH1D("pz","pz histogram",120,-12,12);
	TH1D *pthist=new TH1D("pt","pt histogram",50,0,1.5);
	TH1D *kshist=new TH1D("KSmass","KSmasss",120,0.2,0.8);
	TH1D *kshist2=new TH1D("KSmass","KSmasss",120,0.,5);
	TH1D *pseudohist=new TH1D("Pseudorapidity","Pseudorapidity",120,-15,15);
	
	cout << "Number of events = " << nentries << endl;
	
   //event loop
	for (Long64_t jentry=0; jentry<nentries;jentry++) {//nentries
		Long64_t ientry = LoadTree(jentry);
		if (ientry < 0) break;
		nb = fChain->GetEntry(jentry);   nbytes += nb;
		cout << " event # " << jentry << ",  #particles " <<  entry_ << endl;
		// if (Cut(ientry) < 0) continue;

		//particle loop
		for (int ipart = 0; ipart < entry_ ; ipart++) {
			w.SetPx(entry_pSave_xx[ipart]);
			w.SetPy(entry_pSave_yy[ipart]);
			w.SetPz(entry_pSave_zz[ipart]);
			w.SetE(entry_pSave_tt[ipart]);
			q[ipart]=w;
			l=q[ipart].Vect();
			//~ cout<<"pseudorapidity="<<l.PseudoRapidity()<<endl;
			p[ipart]=l.Mag();
			cout<<"p="<<l.Mag()<<endl;//P!
			//~ cout<<"m="<<q[ipart].M()<<endl;//m?not right
			//~ cout<<"pt="<<q[ipart].Perp()<<endl;//PT!
			//~ cout <<"i="<<ipart<< "\tpdgID = " << entry_idSave[ipart]<<",\t Daughter1="<<entry_idSave[entry_daughter1Save[ipart]]<<",\tDaughter2="<<entry_idSave[entry_daughter2Save[ipart]]<<"\tEnergy="<<entry_pSave_tt[ipart]<<endl;
		
			//pions vs kaons
			if(((TMath::Abs(entry_idSave[ipart]))==(211))||(entry_idSave[ipart]==(111))) {
				pions++;
			} 	
			else if((entry_idSave[ipart]==130)||
				((TMath::Abs(entry_idSave[ipart]))==(321))||(entry_idSave[ipart]==310)
				||((TMath::Abs(entry_idSave[ipart]))==(311))||((TMath::Abs(entry_idSave[ipart]))==(323))
				||((TMath::Abs(entry_idSave[ipart]))==(313)) ) {
				kaons++; 
			}
			
			
			//Ks->pions
			if((entry_idSave[ipart]==310)&&(((entry_idSave[entry_daughter1Save[ipart]]==(211))&&(entry_idSave[entry_daughter2Save[ipart]]==(-1)*(211)))
			||((entry_idSave[entry_daughter1Save[ipart]]==(-1)*(211))&&(entry_idSave[entry_daughter2Save[ipart]]==(211))) )){
				
				ipart1[ksTOpi]=entry_daughter1Save[ipart];
		        ipart2[ksTOpi]=entry_daughter2Save[ipart];
		        cout<<"ipart1="<<ipart1<<"\t ipart2="<<ipart2<<endl;
				ksTOpi++;
				cout<<"ksTOpi="<<ksTOpi<<endl;
				
			}//end of ks->pions if
				
			if(entry_idSave[ipart]==211){
				ppion[i]=ipart;
				i++;}
				
			if(entry_idSave[ipart]==(-1)*(211)){
				npion[j]=ipart;
				j++;}
			
			
			//Fill Histograms
			pzhist->Fill(entry_pSave_zz[ipart]);
			pthist->Fill(q[ipart].Perp());
			pseudohist->Fill(l.PseudoRapidity()); 		
		
		}//end of particle loop
      
		
		//Ksmass 
		for(int n=0;n<i;n++){
			a=ppion[n];
			for(int m=0;m<j;m++){
				b=npion[m];
				v=q[a]+q[b];
				//~ TVector3 y=v.Vect();
				//~ pp=y.Mag();
				//~ E=v.E();
				KSmass=v.M();
				kshist2->Fill(KSmass);
					
			}//end of npion loop
		}//end of ppion loop
				
		//KStoPI
		for(int count=0;count<ksTOpi;count++){
			v=q[ipart1[ksTOpi]]+q[ipart2[ksTOpi]];
			//~ l=v.Vect();
			//~ pp=l.Mag();
			//~ E=v.E();
			KSmass=v.M();
			kshist->Fill(KSmass);
		}//end of ksTOpi loop
			
		i=0;
		j=0;
		ksTOpi=0;
		
	if(kaons!=0){
		prop=prop+((double)kaons)/((double)pions);
		}
		
	
	}//end of event loop
   
	//Wrap-up code
	TCanvas* k1 = new TCanvas("c1","Pythia8Ana",800,800);
	k1->Divide(1, 3);

	k1->cd(1);
	kshist->Draw();
	kshist->GetXaxis()->SetTitle("mass [GeV/c^2]");
	kshist->GetYaxis()->SetTitle("Number of events");

	k1->cd(2);
	kshist2->Draw();
	kshist2->GetXaxis()->SetTitle("mass [GeV/c^2]");
	kshist2->GetYaxis()->SetTitle("Number of events");



	//~ 
	//~ k1->cd(2);
	//~ pseudohist->Draw();
	//~ pseudohist->GetXaxis()->SetTitle("pseudorapidity");
	//~ pseudohist->GetYaxis()->SetTitle("Number of events");



	k1->cd(3);
	pthist->Draw();
	pthist->GetXaxis()->SetTitle("pt [GeV/c]");
	pthist->GetYaxis()->SetTitle("Number of events");

	cout<<"Ebeam1="<<entry_pSave_tt[1]<<"[GeV], Ebeam2="<<entry_pSave_tt[2]<<"[GeV]"<<endl;
	cout<<"Mass1= "<<entry_mSave[1]<<"  Mass2="<<entry_mSave[2]<<endl;
	cout<<"Kaons="<<prop/nentries<<"Pions"<<endl;
	cout<<"kaons="<<kaons<<", Pions="<<pions<<endl;
	cout<<"event found, ipart1="<<ipart1<<"\t ipart2="<<ipart2<<endl;
	cout<<"ipart1="<<ipart1<<endl;
	cout<<"p["<<ipart1<<"]="<<p[ipart1]<<endl;

}//End of Loop method
示例#2
0
int
RecoInfoExport::process_event(PHCompositeNode *topNode)
{
  ++_event;

  stringstream fname;
  fname << _file_prefix << "_Event" << _event << ".dat";
  fstream fdata(fname.str(), ios_base::out);

  for (auto & calo_name : _calo_names)
    {
      string towernodename = "TOWER_CALIB_" + calo_name;
      // Grab the towers
      RawTowerContainer* towers = findNode::getClass<RawTowerContainer>(topNode,
          towernodename.c_str());
      if (!towers)
        {
          std::cout << PHWHERE << ": Could not find node "
              << towernodename.c_str() << std::endl;
          return Fun4AllReturnCodes::ABORTRUN;
        }
      string towergeomnodename = "TOWERGEOM_" + calo_name;
      RawTowerGeomContainer *towergeom = findNode::getClass<
          RawTowerGeomContainer>(topNode, towergeomnodename.c_str());
      if (!towergeom)
        {
          cout << PHWHERE << ": Could not find node "
              << towergeomnodename.c_str() << endl;
          return Fun4AllReturnCodes::ABORTRUN;
        }

      set<const RawTower *> good_towers;

      RawTowerContainer::ConstRange begin_end = towers->getTowers();
      RawTowerContainer::ConstIterator rtiter;
      for (rtiter = begin_end.first; rtiter != begin_end.second; ++rtiter)
        {
          const RawTower *tower = rtiter->second;
          assert(tower);
          if (tower->get_energy() > _tower_threshold)
            {
              good_towers.insert(tower);
            }
        }

      fdata
          << (boost::format("%1% (1..%2% hits)") % calo_name
              % good_towers.size()) << endl;

      bool first = true;
      for (const auto & tower : good_towers)
        {
          assert(tower);

          float eta = towergeom->get_etacenter(tower->get_bineta());
          float phi = towergeom->get_phicenter(tower->get_binphi());

          phi = atan2(cos(phi), sin(phi));

          if (first)
            {
              first = false;
            }
          else
            fdata << ",";

          fdata
              << (boost::format("[%1%,%2%,%3%]") % eta % phi
                  % tower->get_energy());

        }

      fdata << endl;
    }

    {
      fdata << "Track list" << endl;

      // need things off of the DST...
      PHG4TruthInfoContainer* truthinfo = findNode::getClass<
          PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
      if (!truthinfo)
        {
          cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl;
          exit(-1);
        }

      // create SVTX eval stack
      SvtxEvalStack svtxevalstack(topNode);

//  SvtxVertexEval* vertexeval = svtxevalstack.get_vertex_eval();
//  SvtxTrackEval* trackeval = svtxevalstack.get_track_eval();
      SvtxTruthEval* trutheval = svtxevalstack.get_truth_eval();

      // loop over all truth particles
      PHG4TruthInfoContainer::Range range =
          truthinfo->GetPrimaryParticleRange();
      for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
          iter != range.second; ++iter)
        {
          PHG4Particle* g4particle = iter->second;

          const TVector3 mom(g4particle->get_px(), g4particle->get_py(),
              g4particle->get_pz());

          std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle);

          map<float, PHG4Hit *> time_sort;
          map<float, PHG4Hit *> layer_sort;
          for (auto & hit : g4hits)
            {
              if (hit)
                {
                  time_sort[hit->get_avg_t()] = hit;
                }
            }

          for (auto & hit_pair : time_sort)
            {

              if (hit_pair.second->get_layer() != UINT_MAX
                  and layer_sort.find(hit_pair.second->get_layer())
                      == layer_sort.end())
                {
                  layer_sort[hit_pair.second->get_layer()] = hit_pair.second;
                }
            }

          if (layer_sort.size() > 5 and mom.Pt() > _pT_threshold) // minimal track length cut
            {

              stringstream spts;

              TVector3 last_pos(0, 0, 0);

              bool first = true;
              for (auto & hit_pair : layer_sort)
                {
                  TVector3 pos(hit_pair.second->get_avg_x(),
                      hit_pair.second->get_avg_y(),
                      hit_pair.second->get_avg_z());

                  // hit step cuts
                  if ((pos - last_pos).Mag() < _min_track_hit_dist
                      and hit_pair.first != (layer_sort.rbegin()->first)
                      and hit_pair.first != (layer_sort.begin()->first))
                    continue;

                  last_pos = pos;

                  if (first)
                    {
                      first = false;
                    }
                  else
                    spts << ",";

                  spts << "[";
                  spts << pos.x();
                  spts << ",";
                  spts << pos.y();
                  spts << ",";
                  spts << pos.z();
                  spts << "]";
                }

              const int abs_pid = abs(g4particle->get_pid());
              int t = 5;
              if (abs_pid
                  == TDatabasePDG::Instance()->GetParticle("pi+")->PdgCode())
                {
                  t = 1;
                }
              else if (abs_pid
                  == TDatabasePDG::Instance()->GetParticle("proton")->PdgCode())
                {
                  t = 2;
                }
              else if (abs_pid
                  == TDatabasePDG::Instance()->GetParticle("K+")->PdgCode())
                {
                  t = 3;
                }
              else if (abs_pid
                  == TDatabasePDG::Instance()->GetParticle("e-")->PdgCode())
                {
                  t = 3;
                }

              const TParticlePDG * pdg_part =
                  TDatabasePDG::Instance()->GetParticle(11);
              const int c =
                  (pdg_part != nullptr) ? (copysign(1, pdg_part->Charge())) : 0;

              fdata
                  << (boost::format(
                      "{ \"pt\": %1%, \"t\": %2%, \"e\": %3%, \"p\": %4%, \"c\": %5%, \"pts\":[ %6% ]}")
                      % mom.Pt() % t % mom.PseudoRapidity() % mom.Phi() % c
                      % spts.str()) << endl;

            }
        }
    }

  fdata.close();
  return 0;
}