class TCandList; class TCandidate; class TFitParams; class PndAnaPidSelector; class PndAnaPidCombiner; void anatut_psi2s(int nevts=0) { TString OutFile="output.root"; // *** some variables int ievts=0, pionskicked=0, mcpions=0, detectpions=0; const double val=15.0; // will be pbar momentum //val is the momentum of the pbar beam const double mp=0.93827; double P = val; double E = mp+sqrt(P*P+mp*mp); TLorentzVector ini(0, 0, P, E); // *** the lorentz vector of the initial pbar // *** the files coming from the simulation TString inPidFile = "pid_complete.root"; // this file contains the PndPidCandidates TString inRecoFile = "reco_complete.root"; TString inSimFile = "sim_complete.root"; // this file contains the MC truth TString inParFile = "simparams.root"; gROOT->SetStyle("Plain"); gStyle->SetOptFit(1011); gROOT->Macro("$VMCWORKDIR/gconfig/rootlogon.C"); // make StatBox in histograms show more useful information gStyle->SetOptStat(1111110); // with integral //gStyle->SetOptStat(111110); // without integral FairLogger::GetLogger()->SetLogToFile(kFALSE); // *** initialization FairRunAna* fRun = new FairRunAna(); FairRuntimeDb* rtdb = fRun->GetRuntimeDb(); // *** add signal files fRun->SetInputFile(inSimFile); fRun->AddFriend(inPidFile); fRun->AddFriend(inRecoFile); FairParRootFileIo* parIO = new FairParRootFileIo(); parIO->open(inParFile); rtdb->setFirstInput(parIO); rtdb->setOutput(parIO); fRun->SetOutputFile(OutFile); fRun->Init(); // *** create an output file for all histograms TFile *out = TFile::Open("output_psi2sana.root","RECREATE"); // *** creating tuple TNtuple *truetuple = new TNtuple("truetuple","truetuple","rm:pocadistance:pocaVtxX:pocaVtxY:pocaVtxZ:radial:massdifftrue:PRGvtxX:PRGvtxY:PRGvtxZ:PRGradial"); TNtuple *combtuple = new TNtuple("combtuple","combtuple","rm:pocadistance:pocaVtxX:pocaVtxY:pocaVtxZ:radial:PRGvtxX:PRGvtxY:PRGvtxZ:PRGradial"); TNtuple *pidtuple = new TNtuple("pidtuple","pidtuple","rm:pocadistance:pocaVtxX:pocaVtxY:pocaVtxZ:radial:PRGvtxX:PRGvtxY:PRGvtxZ:PRGradial"); TNtuple *truemctuple = new TNtuple("truemctuple","truemctuple","rm:pocadistance:pocaVtxX:pocaVtxY:pocaVtxZ:radial:massdifftrue:PRGvtxX:PRGvtxY:PRGvtxZ:PRGradial"); // *** the data reader object PndAnalysis* theAnalysis = new PndAnalysis("SttMvdGemGenTrack","FtsIdealGenTrack"); if (nevts==0) nevts= theAnalysis->GetEntries(); // *** PID algorithm TString pidalgos("PidAlgoStt;PidAlgoEmcBayes;PidAlgoDrc;PidAlgoDisc"); // TString pidalgos("PidAlgoMvd;PidAlgoStt;PidAlgoEmcBayes;PidAlgoDrc;PidAlgoDisc"); // *** TCandLists for the analysis TCandList mctrk, piplus, piminus, comball, eplus, eminus, muplus, muminus, kplus,kminus; TCandList pidpiplus, pidpiminus, combpid; TCandList truepiplus, truepiminus, combtrue; TCandList mcpiplus, mcpiminus, truemcpiplus, truemcpiminus, combmctrue; // *** the MC truth matcher variable PndMcTruthMatch mcm; // *** // the event loop // *** while (theAnalysis->GetEvent() && ievts++FillList(mctrk,"McTruth"); // *** Select with PID info; type and mass are set theAnalysis->FillList(eplus, "ElectronVeryTightPlus",pidalgos); theAnalysis->FillList(eminus, "ElectronVeryTightMinus",pidalgos); theAnalysis->FillList(muplus, "MuonVeryTightPlus",pidalgos); theAnalysis->FillList(muminus, "MuonVeryTightMinus",pidalgos); theAnalysis->FillList(kminus, "KaonVeryTightMinus",pidalgos); theAnalysis->FillList(kplus, "KaonVeryTightPlus",pidalgos); theAnalysis->FillList(piplus, "PionVeryLoosePlus",pidalgos); theAnalysis->FillList(piminus, "PionVeryLooseMinus",pidalgos); theAnalysis->FillList(mcpiplus, "PionVeryLoosePlus"); theAnalysis->FillList(mcpiminus, "PionVeryLoosePlus"); detectpions+=piplus.GetLength(); detectpions+=piminus.GetLength(); mcpions+=mcpiplus.GetLength(); mcpions+=mcpiminus.GetLength(); // Remove electrons and muons in pi lists for(Int_t l=0;l0){ for(int l=0;l<1;l++){ // recoil mass calculation TLorentzVector mm = ini-combtrue[minmassdiffIdx].P4(); Float_t rm=mm.M(); // PndVtxPRG Vertex Fitter PndVtxPRG prgfitter(combtrue[minmassdiffIdx]); TVector3 PRGvtx; TMatrixD vtxcov(3,3); prgfitter.FitVertexFast(PRGvtx,vtxcov); const TCandidate *combtruefit = combtrue[minmassdiffIdx].GetFit(); Float_t PRGvtxX=PRGvtx.X(); Float_t PRGvtxY=PRGvtx.Y(); Float_t PRGvtxZ=PRGvtx.Z(); Float_t PRGradial; PRGradial=PRGvtxX*PRGvtxX+PRGvtxY*PRGvtxY; // determine pseudo vertex *** POCA PndVtxPoca poca(combtrue[minmassdiffIdx]); TVector3 pocavtx; Float_t pocadistance = poca.GetPocaVtx(pocavtx); Float_t pocaVtxX=pocavtx.X(); Float_t pocaVtxY=pocavtx.Y(); Float_t pocaVtxZ=pocavtx.Z(); Float_t radial; radial=pocaVtxX*pocaVtxX+pocaVtxY*pocaVtxY; // TUPLE FILL Float_t combtuplearray[] = {rm, pocadistance, pocaVtxX, pocaVtxY, pocaVtxZ, radial, massdifftrue, PRGvtxX, PRGvtxY, PRGvtxZ, PRGradial}; truetuple->Fill(combtuplearray); }} // ANALYSE of ALL combined "PIONS" for (int l=0;lFill(combtuplearray2); } // combined recoil mass of mc truth (pid) pions for (int l=0;lFill(combtuplearray3); } // truth match for mc-pi + for (Int_t ipiplus=0;ipiplus0){ for(int l=0;l<1;l++){ // recoil mass calculation TLorentzVector mm = ini-combmctrue[minmassdiffIdx].P4(); Float_t rm=mm.M(); // PndVtxPRG Vertex Fitter PndVtxPRG prgfitter(combmctrue[minmassdiffIdx]); TVector3 PRGvtx; TMatrixD vtxcov(3,3); prgfitter.FitVertexFast(PRGvtx,vtxcov); const TCandidate *combtruefit = combmctrue[minmassdiffIdx].GetFit(); Float_t PRGvtxX=PRGvtx.X(); Float_t PRGvtxY=PRGvtx.Y(); Float_t PRGvtxZ=PRGvtx.Z(); Float_t PRGradial; PRGradial=PRGvtxX*PRGvtxX+PRGvtxY*PRGvtxY; // determine pseudo vertex *** POCA PndVtxPoca poca(combmctrue[minmassdiffIdx]); TVector3 pocavtx; Float_t pocadistance = poca.GetPocaVtx(pocavtx); Float_t pocaVtxX=pocavtx.X(); Float_t pocaVtxY=pocavtx.Y(); Float_t pocaVtxZ=pocavtx.Z(); Float_t radial; radial=pocaVtxX*pocaVtxX+pocaVtxY*pocaVtxY; // TUPLE FILL Float_t combtuplearray4[] = {rm, pocadistance, pocaVtxX, pocaVtxY, pocaVtxZ, radial, massdifftrue, PRGvtxX, PRGvtxY, PRGvtxZ, PRGradial}; truemctuple->Fill(combtuplearray4); }} } cout << "Number of MC pions: " << mcpions << endl; cout << "Number of kicked pions: - " << pionskicked << endl; cout << " ------" << endl; cout << "Number of detected pions: " << detectpions << endl; out->cd(); truetuple->Write(); combtuple->Write(); pidtuple->Write(); out->Save(); }