void run_ana_8He(TString FileNameHead = "output_proto_reco", Int_t num_ev=3000000, Int_t file_ini=0, Int_t file_end=0, Int_t runnum=250, Float_t HoughDist=2.0, Bool_t debug=kTRUE, Bool_t stdhough=kFALSE, TString file="../Kinematics/Decay_kinematics/Kine.txt") { //gStyle->SetCanvasPreferGL(1); //gStyle->SetPalette(1); if(!debug) gErrorIgnoreLevel=kFatal; //Avoid printing Minuit errors TCanvas *ctest = new TCanvas("ctest","ctest",200,10,700,700); TCanvas *c1 = new TCanvas("c1","c1",200,10,700,700); c1->Divide(2,2); TCanvas *c2 = new TCanvas("c2","c2",200,10,700,700); c2->Divide(2,3); TCanvas *c3 = new TCanvas("c3","c3",200,10,700,700); c3->Divide(2,1); TCanvas *c4 = new TCanvas("c4","c4",200,10,700,700); c4->Divide(2,2); TH2F* fQuadrant[4]; for (Int_t i=0; i<4; i++) { fQuadrant[i] = new TH2F(Form("fQuadrant[%i]",i),Form("fQuadrant%i",i),500,0,3.15,2500,0,1000); fQuadrant[i]->SetFillColor(2); } TH1I* DistHist[4]; for (Int_t i=0; i<4; i++) DistHist[i] = new TH1I(Form("DistHist[%i]",i),Form("DistHit%i",i),100,0,1000); TF1 *HoughFit[4]; TF1 *HoughFitSTD[4]; TF1 *fitResult[4]; TF1 *fitResultSTD[4]; TGraph *HitPattern[4]; TGraph *HitPatternSTD[4]; TGraph *HitPatternFilter[4]; TGraph *HitPatternFilterSTD[4]; for (Int_t i=0; i<4; i++) { HoughFit[i] =new TF1(Form("HoughFit%i",i)," ( (-TMath::Cos([0])/TMath::Sin([0]))*x ) + [1]/TMath::Sin([0])",0,120); HoughFit[i]->SetLineColor(kRed); HoughFitSTD[i] =new TF1(Form("HoughFitSTD%i",i)," ( (-TMath::Cos([0])/TMath::Sin([0]))*x ) + [1]/TMath::Sin([0])",0,120); HoughFitSTD[i]->SetLineColor(kBlue); HitPatternFilter[i] = new TGraph(); HitPatternFilter[i]->SetMarkerStyle(22); HitPatternFilter[i]->SetMarkerSize(0.7); HitPatternFilterSTD[i] = new TGraph(); HitPatternFilterSTD[i]->SetMarkerStyle(21); HitPatternFilterSTD[i]->SetMarkerSize(0.7); } TH2D* Q02_Kine = new TH2D("Q02_Kine","Q02_Kine",1000,0,180,1000,0,180); Q02_Kine->SetMarkerColor(2); Q02_Kine->SetMarkerStyle(20); Q02_Kine->SetMarkerSize(0.7); TH2D* Q13_Kine = new TH2D("Q13_Kine","Q13_Kine",1000,0,180,1000,0,180); Q13_Kine->SetMarkerColor(2); Q13_Kine->SetMarkerStyle(20); Q13_Kine->SetMarkerSize(0.7); TH2D* Q02_Kine_buff = new TH2D("Q02_Kine_buff","Q02_Kine_buff",1000,0,180,1000,0,180); Q02_Kine_buff->SetMarkerColor(4); Q02_Kine_buff->SetMarkerStyle(20); Q02_Kine_buff->SetMarkerSize(0.7); TH2D* Q13_Kine_buff = new TH2D("Q13_Kine_buff","Q13_Kine_buff",1000,0,180,1000,0,180); Q13_Kine_buff->SetMarkerColor(4); Q13_Kine_buff->SetMarkerStyle(20); Q13_Kine_buff->SetMarkerSize(0.7); TH2F* fQuadHist[4]; for (Int_t i=0; i<4; i++) { fQuadHist[i] = new TH2F(Form("fQuadHist[%i]",i),Form("fQuadHist%i",i),100,0,130,200,0,500); fQuadHist[i]->SetFillColor(2); } Int_t tTreeEv=0; Double_t tHoughPar0[4]= {0}; Double_t tHoughPar1[4]= {0}; Double_t tFitPar0[4]= {0}; Double_t tFitPar1[4]= {0}; Double_t tAngleHough[4]= {0}; Double_t tAngleFit[4]= {0}; TFile *f = new TFile("analysis_8He.root","RECREATE"); TTree *treeOut = new TTree("AnalysisTree","AnalysisTree"); treeOut->Branch("tTreeEv",&tTreeEv,"tTreeEv/I"); treeOut->Branch("tHoughPar0",&tHoughPar0,"tHoughPar0[4]/D"); treeOut->Branch("tHoughPar1",&tHoughPar1,"tHoughPar1[4]/D"); treeOut->Branch("tFitPar0",&tFitPar0,"tFitPar0[4]/D"); treeOut->Branch("tFitPar1",&tFitPar1,"tFitPar1[4]/D"); treeOut->Branch("tAngleHough",&tAngleHough,"tAngleHough[4]/D"); treeOut->Branch("tAngleFit",&tAngleFit,"tAngleFit[4]/D"); TChain *chain = new TChain("cbmsim"); TFileCollection *filecol = new TFileCollection(); TString FileNameHead_num; TString FileNameHead_chain; for(Int_t i=0; i<=file_end; i++) { if(i<10) FileNameHead_num.Form("%i_000%i",runnum,i); else if(i<100) FileNameHead_num.Form("%i_00%i",runnum,i); else if(i<1000) FileNameHead_num.Form("%i_0%i",runnum,i); FileNameHead_chain = "../run"+FileNameHead_num+".root"; std::cout<<" File : "<<FileNameHead_chain<<" added"<<std::endl; //filecol->Add(FileNameHead_chain); //chain->Add(FileNameHead_chain); //TString FileNameHead = "../run571_0003"; TString workdir = getenv("VMCWORKDIR"); //TString FilePath = workdir + "/macro/data/pATTPC/TRIUMF_ISAC_2015/"; TString FilePath = workdir + "/macro/Unpack_GETDecoder2/"; TString FileNameTail = ".root"; TString FileName = FilePath + FileNameHead + FileNameTail; //TString outFileNameHead = "data/"; //TString outFileNameTail = ".root"; //TString outFileName = outFileNameHead + reactionName + outFileNameTail; std::cout<<" Opening File : "<<FileName.Data()<<std::endl; TFile* file = new TFile(FileName.Data(),"READ"); //TFile* file = new TFile(FileNameHead_chain.Data(),"READ"); TTree* tree = (TTree*) file -> Get("cbmsim"); Int_t nEvents = tree -> GetEntriesFast(); std::cout<<" Number of events : "<<nEvents<<std::endl; TTreeReader Reader1("cbmsim", file); //TTreeReaderValue<TClonesArray> eventArray(Reader1, "ATEventH"); TTreeReaderValue<TClonesArray> protoeventArray(Reader1, "ATProtoEvent"); TTreeReaderValue<TClonesArray> houghArray(Reader1, "ATHough"); Bool_t fIsLinear=kFALSE; Bool_t fIsCircular=kFALSE; Int_t value; Int_t nEve=0; while (Reader1.Next() && nEve<num_ev) { tTreeEv=nEve; if(debug) mypause(); Q02_Kine_buff->Reset(0); Q13_Kine_buff->Reset(0); for (Int_t i=0; i<4; i++) { fQuadHist[i]->Reset(); HitPatternFilter[i]->Set(0); HitPatternFilterSTD[i]->Set(0); } ATProtoEvent* protoevent = (ATProtoEvent*) protoeventArray->At(0); std::vector<ATProtoQuadrant> quadrantArray; ATProtoQuadrant* quadrant; std::vector<Int_t> qNumHits; std::vector<Double_t> qRad; //ATEvent* event = (ATEvent*) eventArray->At(0); //Int_t nHits = event->GetNumHits(); //std::cout<<" ==================================================================================="<<std::endl; //if(nEve%100==0) std::cout<<" Event number : "<<protoevent->GetEventID()<<" - Number of Hits : "<<nHits<<std::endl; //if(nEve%100==0) std::cout<<cRED<<" Event Number : "<<nEve<<cNORMAL<<std::endl; if(debug) for (Int_t i=0; i<4; i++) DistHist[i]->Reset(0); ATHoughSpaceLine* fHoughSpaceLine_buff = dynamic_cast<ATHoughSpaceLine*> (houghArray->At(0)); // ATHoughSpaceCircle* fHoughSpaceCircle_buff; /* if( (fHoughSpaceLine_buff = dynamic_cast<ATHoughSpaceLine*> (houghArray->At(0)) )){ //std::cout<<" Linear Hough Space Found!"<<std::endl; fIsLinear=kTRUE; }else if( (fHoughSpaceCircle_buff = dynamic_cast<ATHoughSpaceCircle*> (houghArray->At(0)) )){ //std::cout<<"Circular Hough Space Found!"<<std::endl; fIsCircular=kTRUE; }else std::cout<<"Hough Space Type NOT Found!"<<std::endl;*/ std::vector<std::pair<Double_t,Double_t>> HoughPar = fHoughSpaceLine_buff->GetHoughPar(); //No argument retrieve parameters from Hough Histogram std::vector<std::pair<Double_t,Double_t>> HoughParSTD; if(stdhough) HoughParSTD = fHoughSpaceLine_buff->GetHoughPar("STD"); std::vector<Double_t> par0_fit; std::vector<Double_t> par1_fit; std::vector<Double_t> Angle; std::vector<Double_t> Angle_fit; std::vector<Double_t> par0_fitSTD; std::vector<Double_t> par1_fitSTD; std::vector<Double_t> AngleSTD; std::vector<Double_t> Angle_fitSTD; //par0_fit.resize(4); //par1_fit.resize(4); for(Int_t i=0; i<HoughPar.size(); i++) { Angle.push_back(180-HoughPar.at(i).first*180/TMath::Pi()); tHoughPar0[i]=HoughPar.at(i).first; tHoughPar1[i]=HoughPar.at(i).second; tAngleHough[i]=180-HoughPar.at(i).first*180/TMath::Pi(); if(debug) { std::cout<<" ------ Hough Parameters for Quadrant : "<<i<<std::endl; std::cout<<" Angle HIST : "<<180-HoughPar.at(i).first*180/TMath::Pi()<<std::endl; std::cout<<" Distance HIST : "<<HoughPar.at(i).second<<std::endl; if(stdhough && debug) { std::cout<<" Angle STD : "<<180-HoughParSTD.at(i).first*180/TMath::Pi()<<std::endl; std::cout<<" Distance STD : "<<HoughParSTD.at(i).second<<std::endl; } HoughFit[i]->SetParameter(0,HoughPar.at(i).first); HoughFit[i]->SetParameter(1,HoughPar.at(i).second); //HoughFit[i]->SetRange(0,qRad.at(i)); if(stdhough) { HoughFitSTD[i]->SetParameter(0,HoughParSTD.at(i).first); HoughFitSTD[i]->SetParameter(1,HoughParSTD.at(i).second); //HoughFitSTD[i]->SetRange(0,qRad.at(i)); } } }// HoughPar Loop for (Int_t i=0; i<4; i++) { //fQuadrant[i] = fHoughSpaceLine_buff->GetHoughQuadrant(i); //Obsolete quadrant = &protoevent->GetQuadrantArray()->at(i); qNumHits.push_back(quadrant->GetNumHits()); Int_t qNumHit = quadrant->GetNumHits(); Double_t *rad_graph = new Double_t[qNumHit]; Double_t *posz_graph = new Double_t[qNumHit]; Double_t rad_max=0.0; for(Int_t j=0; j<qNumHit; j++) { ATHit* qhit = quadrant->GetHit(j); TVector3 position = qhit->GetPosition(); //position.SetZ( (qhit->GetTimeStamp()-390)*2.8*80/10.0 ); //position.SetZ( (390-qhit->GetTimeStamp())*2.8*80.0/100.0 ); Double_t radius = TMath::Sqrt( TMath::Power(position.X(),2) + TMath::Power(position.Y(),2) ); if(radius>rad_max) rad_max=radius; fQuadHist[i]->Fill(radius,position.Z(),qhit->GetCharge()); rad_graph[j] = radius; posz_graph[j] = position.Z(); Int_t pixelY = ctest->YtoAbsPixel(position.Z()); Int_t pixelX = ctest->XtoAbsPixel(radius); Int_t pixelYback = ctest->AbsPixeltoY(pixelY); Int_t pixelXback = ctest->AbsPixeltoX(pixelX); Int_t mda = HoughFit[i]->DistancetoPrimitive(-pixelX,pixelY); //Minimum Distance of Approach in Pixels DistHist[i]->Fill(mda); Double_t geo_dist_STD = 0.0; Double_t geo_dist = TMath::Abs (TMath::Cos(HoughPar.at(i).first)*radius + TMath::Sin(HoughPar.at(i).first)*position.Z() - HoughPar.at(i).second); if(stdhough) geo_dist_STD = TMath::Abs (TMath::Cos(HoughParSTD.at(i).first)*radius + TMath::Sin(HoughParSTD.at(i).first)*position.Z() - HoughParSTD.at(i).second); // An example to make annotations to each one of the TGraph points /* TLatex *latex = new TLatex(gr->GetX()[5], gr->GetY()[5],"my annotation"); gr->GetListOfFunctions()->Add(latex); gr->Draw("alp"); latex->SetTextSize(0.07); latex->SetTextColor(kRed);*/ /*if(debug){ std::cout<<" ___________________________________________________________________________________________________"<<std::endl; std::cout<<" Hit : "<<j<<" - Radius : "<<radius<<" - Z pos : "<<position.Z()<<" - Distance to Hough Space : "<<mda<<" Geomtrical Distance : "<<geo_dist<<std::endl; //std::cout<<" Pixel X : "<<pixelX<<" Pixel Y : "<<pixelY<<std::endl; //std::cout<<" Pixel Back X : "<<pixelXback<<" Pixel Back Y : "<<pixelYback<<std::endl; }*/ if(geo_dist<HoughDist) HitPatternFilter[i]->SetPoint(HitPatternFilter[i]->GetN(),radius,position.Z()); if(stdhough) if(geo_dist_STD<HoughDist) HitPatternFilterSTD[i]->SetPoint(HitPatternFilterSTD[i]->GetN(),radius,position.Z()); }//NumHit loop Double_t par0=0.0; Double_t par1=0.0; Double_t afit=0.0; Double_t par0STD=0.0; Double_t par1STD=0.0; Double_t afitSTD=0.0; qRad.push_back(rad_max); //HoughFit[i]->SetRange(0,rad_max); if(debug) HitPattern[i] = new TGraph(qNumHit,rad_graph,posz_graph); if(debug && stdhough) HitPatternSTD[i] = new TGraph(qNumHit,rad_graph,posz_graph); if(debug)std::cout<<cYELLOW<<" Fitting Quadrant : "<<i<<cNORMAL<<std::endl; if(HitPatternFilter[i]->GetN()>3) { //if(qNumHit>3){ HitPatternFilter[i]->Fit("pol1","FQ"); fitResult[i] = HitPatternFilter[i]->GetFunction("pol1"); if(stdhough) { HitPatternFilterSTD[i]->Fit("pol1","FQ"); fitResultSTD[i] = HitPatternFilterSTD[i]->GetFunction("pol1"); } //if(!fitResult[i]) std::cout<<" NULL "<<std::endl; if(fitResult[i]) { Bool_t IsValid = fitResult[i]->IsValid(); fitResult[i] ->SetName(Form("fitResult%i",i)); fitResult[i] ->SetLineColor(kRed); fitResult[i] ->SetLineWidth(1); par0 = fitResult[i]->GetParameter(0); par1 = fitResult[i]->GetParameter(1); if(par1>=0) afit = TMath::ATan2(1,TMath::Abs(par1)); else if(par1<0) afit = TMath::Pi()-TMath::ATan2(1,TMath::Abs(par1)); //std::cout<<" Par 0 : "<<par0<<std::endl; //std::cout<<" Par 1 : "<<par1<<std::endl; //if(gMinuit && debug) std::cout<<gMinuit->fCstatu<<std::endl; } if(fitResultSTD[i] && stdhough) { Bool_t IsValid = fitResultSTD[i]->IsValid(); fitResultSTD[i] ->SetName(Form("fitResultSTD%i",i)); fitResultSTD[i] ->SetLineColor(kRed); fitResultSTD[i] ->SetLineWidth(1); par0STD = fitResultSTD[i]->GetParameter(0); par1STD = fitResultSTD[i]->GetParameter(1); if(par1STD>=0) afitSTD = TMath::ATan2(1,TMath::Abs(par1)); else if(par1STD<0) afitSTD = TMath::Pi()-TMath::ATan2(1,TMath::Abs(par1)); } } par0_fit.push_back(par0); par1_fit.push_back(par1); Angle_fit.push_back(afit*180/TMath::Pi()); tFitPar0[i]=par0; tFitPar1[i]=par1; tAngleFit[i]=afit*180/TMath::Pi(); if(stdhough) { par0_fitSTD.push_back(par0STD); par1_fitSTD.push_back(par1STD); Angle_fitSTD.push_back(afitSTD*180/TMath::Pi()); } }// Quadrant Loop /*std::cout<<" Radius Q0 : "<<qRad.at(0)<<std::endl; std::cout<<" Radius Q1 : "<<qRad.at(1)<<std::endl; std::cout<<" Radius Q2 : "<<qRad.at(2)<<std::endl; std::cout<<" Radius Q3 : "<<qRad.at(3)<<std::endl;*/ if((qRad.at(0)>5 && qRad.at(2)>5) && (qNumHits.at(0)>5 && qNumHits.at(2)>5) && TMath::Abs(par0_fit.at(0)-par0_fit.at(2))<50 ) { Q02_Kine->Fill(Angle_fit.at(0),Angle_fit.at(2)); Q02_Kine_buff->Fill(Angle_fit.at(0),Angle_fit.at(2)); if(debug) { std::cout<<" Vertex difference : "<<TMath::Abs(par0_fit.at(0)-par0_fit.at(2))<<std::endl; std::cout<<" Quadrant 0 - Par 0 : "<<par0_fit.at(0)<<" Par 1 : "<<par1_fit.at(0)<<std::endl; std::cout<<" Quadrant 2 - Par 0 : "<<par0_fit.at(2)<<" Par 1 : "<<par1_fit.at(2)<<std::endl; std::cout<<" Angle from Hough Space Quadrant 0 : "<<Angle.at(0)<<" Angle from Hough Space Quadrant 2 : "<<Angle.at(2)<<std::endl; std::cout<<" Angle from Fit Quadrant 0 : "<<Angle_fit.at(0)<<" Angle from Fit Quadrant 2 : "<<Angle_fit.at(2)<<std::endl; } } if((qRad.at(1)>5 && qRad.at(3)>5) && (qNumHits.at(1)>5 && qNumHits.at(3)>5) && TMath::Abs(par0_fit.at(1)-par0_fit.at(3))<50) { Q02_Kine->Fill(Angle_fit.at(1),Angle_fit.at(3)); Q02_Kine_buff->Fill(Angle_fit.at(1),Angle_fit.at(3)); if(debug) { std::cout<<" Vertex difference : "<<TMath::Abs(par0_fit.at(1)-par0_fit.at(3))<<std::endl; std::cout<<" Quadrant 1 - Par 0 : "<<par0_fit.at(1)<<" Par 1 : "<<par1_fit.at(1)<<std::endl; std::cout<<" Quadrant 3 - Par 0 : "<<par0_fit.at(3)<<" Par 1 : "<<par1_fit.at(3)<<std::endl; std::cout<<" Angle from Hough Space Quadrant 1 : "<<Angle.at(1)<<" Angle from Hough Space Quadrant 3 : "<<Angle.at(3)<<std::endl; std::cout<<" Angle from Fit Quadrant 1 : "<<Angle_fit.at(1)<<" Angle from Fit Quadrant 3 : "<<Angle_fit.at(3)<<std::endl; } } if(stdhough) { if((qRad.at(0)>5 && qRad.at(2)>5) && (qNumHits.at(0)>5 && qNumHits.at(2)>5) && TMath::Abs(par0_fitSTD.at(0)-par0_fitSTD.at(2))<50 ) { Q13_Kine->Fill(Angle_fitSTD.at(0),Angle_fitSTD.at(2)); Q13_Kine_buff->Fill(Angle_fitSTD.at(0),Angle_fitSTD.at(2)); } if((qRad.at(1)>5 && qRad.at(3)>5) && (qNumHits.at(1)>5 && qNumHits.at(3)>5) && TMath::Abs(par0_fitSTD.at(1)-par0_fitSTD.at(3))<50) { Q13_Kine->Fill(Angle_fitSTD.at(1),Angle_fitSTD.at(3)); Q13_Kine_buff->Fill(Angle_fitSTD.at(1),Angle_fitSTD.at(3)); } } /*for(Int_t iHit=0; iHit<nHits; iHit++) { ATHit hit = event->GetHitArray()->at(iHit); }*/ if(debug) { c1->cd(1); HitPattern[0]->Draw("A*"); //HitPatternFilter[0]->Draw("A*"); HoughFit[0]->Draw("SAME"); if(stdhough) HoughFitSTD[0]->Draw("SAME"); c1->cd(2); HitPattern[1]->Draw("A*"); HoughFit[1]->Draw("SAME"); if(stdhough) HoughFitSTD[1]->Draw("SAME"); c1->cd(3); HitPattern[2]->Draw("A*"); HoughFit[2]->Draw("SAME"); if(stdhough) HoughFitSTD[2]->Draw("SAME"); c1->cd(4); HitPattern[3]->Draw("A*"); HoughFit[3]->Draw("SAME"); if(stdhough) HoughFitSTD[3]->Draw("SAME"); c1->Modified(); c1->Update(); c4->cd(1); //DistHist[0]->Draw(); HitPatternFilter[0]->Draw("A*"); c4->cd(2); //DistHist[1]->Draw(); HitPatternFilter[1]->Draw("A*"); c4->cd(3); //DistHist[2]->Draw(); HitPatternFilter[2]->Draw("A*"); c4->cd(4); //DistHist[3]->Draw(); HitPatternFilter[3]->Draw("A*"); c4->Modified(); c4->Update(); c2->cd(1); fQuadHist[0]->Draw("contz"); c2->cd(2); fQuadHist[1]->Draw("contz"); c2->cd(3); fQuadHist[2]->Draw("contz"); c2->cd(4); fQuadHist[3]->Draw("contz"); c2->cd(5); Q02_Kine->Draw(""); Q02_Kine_buff->Draw("SAME"); c2->cd(6); Q13_Kine->Draw(""); Q13_Kine_buff->Draw("SAME"); c2->Modified(); c2->Update(); ctest->cd(); HitPattern[0]->Draw("A*"); HoughFit[0]->Draw("SAMES"); ctest->Modified(); ctest->Update(); std::cout<<cRED<<" Here"<<cNORMAL<<std::endl; } /*c1->cd(1); //Obsolete fQuadrant[0]->Draw("zcol"); c1->cd(2); fQuadrant[1]->Draw("zcol"); c1->cd(3); fQuadrant[2]->Draw("zcol"); c1->cd(4); fQuadrant[3]->Draw("zcol"); c1->Modified(); c1->Update(); */ //myflush ( std::cin ); //mypause(); //std::cin.get(); nEve++; treeOut->Fill(); }//While file->Close(); }//for files f->cd(); treeOut->Write(); f->Close(); Double_t *ThetaCMS = new Double_t[20000]; Double_t *ThetaLabRec = new Double_t[20000]; Double_t *EnerLabRec = new Double_t[20000]; Double_t *ThetaLabSca = new Double_t[20000]; Double_t *EnerLabSca = new Double_t[20000]; std::ifstream *kineStr = new std::ifstream(file.Data()); Int_t numKin=0; if(!kineStr->fail()) { while(!kineStr->eof()) { *kineStr>>ThetaCMS[numKin]>>ThetaLabRec[numKin]>>EnerLabRec[numKin]>>ThetaLabSca[numKin]>>EnerLabSca[numKin]; numKin++; } } else if(kineStr->fail()) std::cout<<" Warning : No Kinematics file found for this reaction! Please run the macro on $SIMPATH/macro/Kinematics/Decay_kinematics/Mainrel.cxx"<<std::endl;