diff --git a/macro/mcbm/mcbm_analyze_delta_electrons.C b/macro/mcbm/mcbm_analyze_delta_electrons.C new file mode 100644 index 0000000000000000000000000000000000000000..c2497b99059727e2614bf28c9ae0f63795de8ad4 --- /dev/null +++ b/macro/mcbm/mcbm_analyze_delta_electrons.C @@ -0,0 +1,140 @@ +/** @file mcbm_analyze_delta_electrons.C + ** @author Dominik Smith <d.smith@gsi.de> + ** @since 22 July 2020 + **/ + +/** @brief Main method + ** @param dataSet Prefix for input file names + ** @param beamAngle Angle of beam in global c.s. in x-z plane + ** @param targetDz Thickness of target [cm] + ** + ** Reads output of a mcbm_transport_beam.C run. Finds + ** all MC tracks which hit a STS detector, then creates + ** 3D histogram of their origin cooridinates, as well as 2D + ** histograms in the x-z and y-z plane. Stores filtered + ** MC tracks and histograms in output file, as well as a + ** TCanvas in which the path of the beam and the boundaries + ** of the target are marked as lines in the x-z histogram. + **/ + +int mcbm_analyze_delta_electrons(TString dataSet = "mcbm_beam", + Double_t beamAngle = 25., + Double_t targetDz = 0.025) { + + TString inFile = "./" + dataSet + ".tra.root"; + TFile* input = new TFile(inFile); + if (!input) { + cout << "*** analyze_delta_electrons: Input file " << inFile + << " not found!\n" + << "Be sure to run mcbm_transport_beam.C before!" << endl; + exit(1); + } + + // Output file + TString outFile = "./" + dataSet + "_delta_analysis.root"; + + // Input tree and branch + TTree* tree = (TTree*) input->Get("cbmsim"); + TClonesArray* stsPoints = new TClonesArray("CbmStsPoint"); + TClonesArray* mcTracks = new TClonesArray("CbmMCTrack"); + + tree->SetBranchAddress("StsPoint", &stsPoints); + tree->SetBranchAddress("MCTrack", &mcTracks); + + /* histogram creation */ + + TH1* h1 = + new TH1I("stsHisto", "STS points; number of points; count", 12, 0.0, 12.0); + + for (Int_t event = 0; event < tree->GetEntriesFast(); event++) { + tree->GetEntry(event); + cout << "*** Processing event " << event << endl; + cout << "Number of MC tracks: " << mcTracks->GetEntriesFast() << endl; + cout << "Number of STS points: " << stsPoints->GetEntriesFast() << endl; + cout << endl; + h1->Fill(stsPoints->GetEntriesFast()); + } + + /* collect mc tracks */ + CbmMCTrack* thisTrack = NULL; + TTree* stsTrackList = new TTree("stsTrackList", "MC tracks which hit STS"); + stsTrackList->Branch("StsTrack", &thisTrack); + + /* clang-format off */ + TH3* h3 = new TH3I("trackHisto", "MCtrack origin points; x; y; z", 140, -0.3, 0.3, 140, -0.3, 0.3, 140, -0.3, 0.3 ); + TH2* h2xz = new TH2I("trackHisto", "MCtrack origin points; x; z", 140, -0.3, 0.3, 140, -0.3, 0.3 ); + TH2* h2yz = new TH2I("trackHisto", "MCtrack origin points; y; z", 140, -0.3, 0.3, 140, -0.3, 0.3 ); + /* clang-format on */ + + for (Int_t event = 0; event < tree->GetEntriesFast(); event++) { + tree->GetEntry(event); + cout << "*** Processing event " << event << endl; + cout << "Number of STS points: " << stsPoints->GetEntriesFast() << endl; + + for (Int_t point = 0; point < stsPoints->GetEntriesFast(); point++) { + CbmStsPoint* thisPoint = static_cast<CbmStsPoint*>(stsPoints->At(point)); + cout << "Track ID :" << thisPoint->GetTrackID() << endl; + cout << "PID :" << thisPoint->GetPid() << endl; + + if (thisPoint->GetPid() == 11) { + thisTrack = + static_cast<CbmMCTrack*>(mcTracks->At(thisPoint->GetTrackID())); + cout << "StartX = " << thisTrack->GetStartX() + << " , StartY = " << thisTrack->GetStartY() + << " , StartZ = " << thisTrack->GetStartZ() << endl; + stsTrackList->Fill(); + h3->Fill(thisTrack->GetStartX(), + thisTrack->GetStartY(), + thisTrack->GetStartZ()); + h2xz->Fill(thisTrack->GetStartX(), thisTrack->GetStartZ()); + h2yz->Fill(thisTrack->GetStartY(), thisTrack->GetStartZ()); + } + } + cout << endl; + } + + TCanvas* hisCanvas = + new TCanvas("hisCanvas", "Histograms", 150, 10, 1200, 600); + hisCanvas->Divide(2, 1); + hisCanvas->cd(1); + gPad->SetGridx(); + gPad->SetGridy(); + h2xz->Draw("COLZ"); + + Double_t beamStartX = -1.0 * sin(beamAngle * TMath::DegToRad()); + Double_t beamStartY = -1.0 * cos(beamAngle * TMath::DegToRad()); + TLine* beam = new TLine(beamStartX, beamStartY, 0., 0.); + beam->SetLineColor(kRed); + beam->Draw("same"); + + TVector2 p1(-0.3, targetDz / 2.); + TVector2 p2(0.3, targetDz / 2.); + p1 = p1.Rotate(-beamAngle * TMath::DegToRad()); + p2 = p2.Rotate(-beamAngle * TMath::DegToRad()); + TLine* targetTop = new TLine(p1.X(), p1.Y(), p2.X(), p2.Y()); + targetTop->SetLineColor(kBlack); + targetTop->Draw("same"); + + TVector2 p3(-0.3, -targetDz / 2.); + TVector2 p4(0.3, -targetDz / 2.); + p3 = p3.Rotate(-beamAngle * TMath::DegToRad()); + p4 = p4.Rotate(-beamAngle * TMath::DegToRad()); + TLine* targetBottom = new TLine(p3.X(), p3.Y(), p4.X(), p4.Y()); + targetBottom->SetLineColor(kBlack); + targetBottom->Draw("same"); + + hisCanvas->cd(2); + gPad->SetGridx(); + gPad->SetGridy(); + h2yz->Draw("COLZ"); + + TFile f(outFile, "recreate"); + stsTrackList->Write(); + hisCanvas->Write(); + h1->Write(); + h3->Write(); + h2xz->Write(); + h2yz->Write(); + + return 0; +}