From bd7a7d62f65f7ee74891d12b699a31f6a4130899 Mon Sep 17 00:00:00 2001
From: Anna Senger <a.senger@gsi.de>
Date: Mon, 14 Sep 2020 10:22:30 +0200
Subject: [PATCH] Update macro/analysis/much/ANN.C

---
 macro/analysis/much/ANN.C | 276 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 276 insertions(+)
 create mode 100644 macro/analysis/much/ANN.C

diff --git a/macro/analysis/much/ANN.C b/macro/analysis/much/ANN.C
new file mode 100644
index 0000000000..4b07bd9502
--- /dev/null
+++ b/macro/analysis/much/ANN.C
@@ -0,0 +1,276 @@
+//---------------------------------------------------
+//
+// ANN training of muon track candidates
+//
+// CbmAnaDimuonAnalysis has to be used with UseCuts(kFALSE)
+//
+// Anna Senger a.senger@gsi.de
+//
+//---------------------------------------------------
+
+void ANN(Int_t energy=8, Int_t NofFiles=1000,
+	 TString dir="../../much/data/",
+	 TString setup="sis100_muon_lmvm",
+	 Int_t ntrain=300, Int_t neurons=16)
+{
+ gStyle->SetCanvasColor(10);
+ gStyle->SetFrameFillColor(10);
+ gStyle->SetHistLineWidth(4);
+ gStyle->SetPadColor(10);
+ gStyle->SetStatColor(10);
+ gStyle->SetPalette(55);
+ gStyle->SetPaintTextFormat("2.1f");
+
+ Double_t Chi2Vertex, Chi2STS, Chi2MUCH, Chi2TRD;
+ Int_t NofSTS, NofMUCH, NofTRD;
+ Double_t P, M;
+
+ TTree *Signal = new TTree("Signal","mu");
+ Signal->Branch("P", &P, "P/D", 20000000);
+ Signal->Branch("M", &M, "M/D", 20000000);
+ Signal->Branch("Chi2Vertex",&Chi2Vertex,"Chi2Vertex/D",20000000);
+ Signal->Branch("Chi2STS",   &Chi2STS,   "Chi2STS/D",   20000000);
+ Signal->Branch("Chi2MUCH",  &Chi2MUCH,  "Chi2MUCH/D",  20000000);
+ Signal->Branch("Chi2TRD",  &Chi2TRD,  "Chi2TRD/D",  20000000);
+ Signal->Branch("NofSTS", &NofSTS, "NofSTS/I", 20000000);
+ Signal->Branch("NofMUCH",&NofMUCH,"NofMUCH/I",20000000);
+ Signal->Branch("NofTRD", &NofTRD, "NofTRD/I", 20000000);
+
+ TTree *Bg = new TTree("Background","bg");
+ Bg->Branch("P", &P, "P/D", 20000000);
+ Bg->Branch("M", &M, "M/D", 20000000);
+ Bg->Branch("Chi2Vertex",&Chi2Vertex,"Chi2Vertex/D",20000000);
+ Bg->Branch("Chi2STS",   &Chi2STS,   "Chi2STS/D",   20000000);
+ Bg->Branch("Chi2MUCH",  &Chi2MUCH,  "Chi2MUCH/D",  20000000);
+ Bg->Branch("Chi2TRD",  &Chi2TRD,  "Chi2TRD/D",  20000000);
+ Bg->Branch("NofSTS", &NofSTS, "NofSTS/I", 20000000);
+ Bg->Branch("NofMUCH",&NofMUCH,"NofMUCH/I",20000000);
+ Bg->Branch("NofTRD", &NofTRD, "NofTRD/I", 20000000);
+
+ TString name;
+
+ TClonesArray *MuPlus = new TClonesArray("CbmAnaMuonCandidate");
+ TClonesArray *MuMinus = new TClonesArray("CbmAnaMuonCandidate");
+ TTree *InputTree;
+
+ Int_t MUCHhits= 9;
+ Int_t STShits = 4;
+ Int_t TRDhits = 1;
+ Int_t TOFhits = 1;
+
+ Double_t MUCHchi2= 5.;
+ Double_t STSchi2 = 5.; 
+ Double_t Vchi2   = 5.;
+ Double_t Mcut    = 5.;
+ Double_t Pcut    = 20.;
+
+//--------------------------------------------------------
+ for(int i=0; i<2; i++){
+    for(int k=1; k<NofFiles+1; k++)
+    {
+      if(i==0)name.Form("%s/%s/%dgev/omega/%d/muons.ana.root",dir.Data(),setup.Data(),energy,k);
+     else name.Form("%s/%s/%dgev/centr/%d/muons.ana.root",dir.Data(),setup.Data(),energy,k);
+    
+     TFile *f = new TFile(name);
+     if (f->IsZombie() || f->GetNkeys() < 1 || f->TestBit(TFile::kRecovered)){f->Close();continue;}
+     
+     if(k%100 == 0)cout<<"Input File "<<k<<" : "<<f->GetName()<<endl;
+     
+     InputTree = (TTree*)f->Get("cbmsim");  
+     InputTree->SetBranchAddress("MuPlus",  &MuPlus); 
+     InputTree->SetBranchAddress("MuMinus", &MuMinus); 
+       
+     //----------------------------------------------------------- 
+ 
+     for(int iEvent=0; iEvent<InputTree->GetEntries(); iEvent++)
+       {	
+	 InputTree->GetEntry(iEvent);
+
+	 int NofPlus  = MuPlus->GetEntriesFast();
+	 int NofMinus = MuMinus->GetEntriesFast();
+	 for (int iPart=0; iPart<NofPlus; iPart++){
+	   Bool_t trigger = kFALSE;
+	   
+	   CbmAnaMuonCandidate  *mu_pl = (CbmAnaMuonCandidate*)MuPlus->At(iPart);
+	   
+	   if((i==0 && mu_pl->GetTrueMu()==1) || i==1)trigger=kTRUE;
+	   if(!trigger)continue;
+
+	   TLorentzVector *P_pl = mu_pl->GetMomentum();
+	   M = mu_pl->GetTofM();
+	   P = P_pl->P();	   
+	   
+	   if(mu_pl->GetNStsHits() < STShits)continue;
+	   if(mu_pl->GetNMuchHits()< MUCHhits)continue;
+	   if(mu_pl->GetNTofHits() < 1)continue;
+	   /*
+	   if(M > Mcut || M < -10)continue;
+	   if(P > Pcut)continue;
+	   
+	   if(mu_pl->GetChiToVertex() > Vchi2 || mu_pl->GetChiToVertex() < 0)continue;
+	   if(mu_pl->GetChiSts() > STSchi2    || mu_pl->GetChiSts() < 0)     continue;
+	   if(mu_pl->GetChiMuch()> MUCHchi2   || mu_pl->GetChiMuch() < 0)    continue;
+	   if(mu_pl->GetNTofHits() < 1) continue;
+	   if(mu_pl->GetNMuchHits()< 1)continue;
+	   if(M > Mcut)continue;
+	   */
+	   Chi2Vertex = mu_pl->GetChiToVertex();
+	   Chi2STS    = mu_pl->GetChiSts();
+	   Chi2MUCH   = mu_pl->GetChiMuch();
+	   Chi2TRD    = mu_pl->GetChiTrd();
+	   
+	   NofSTS  = mu_pl->GetNStsHits();
+	   NofMUCH = mu_pl->GetNMuchHits();
+	   NofTRD  = mu_pl->GetNTrdHits();
+	   if(i==0)Signal->Fill(); else Bg->Fill(); 
+
+	 }
+	 for (int jPart=0; jPart<NofMinus; jPart++){
+	   Bool_t trigger = kFALSE;
+	   
+	   CbmAnaMuonCandidate  *mu_mn = (CbmAnaMuonCandidate*)MuMinus->At(jPart);
+	   
+	   if((i==0 && mu_mn->GetTrueMu()==1) || i==1)trigger=kTRUE;
+	   if(!trigger)continue;
+
+	   TLorentzVector *P_mn = mu_mn->GetMomentum();
+	   M = mu_mn->GetTofM();
+	   P = P_mn->P();
+	  
+	   if(mu_mn->GetNStsHits() < STShits)continue;
+	   if(mu_mn->GetNMuchHits()< MUCHhits)continue;
+	   if(mu_mn->GetNTofHits() < 1)continue;
+	   
+	   /*
+	   if(M > Mcut || M < -10)continue;
+	   if(P > Pcut)continue;
+	  
+	   if(mu_mn->GetChiToVertex() > Vchi2 || mu_mn->GetChiToVertex() < 0)continue;
+	   if(mu_mn->GetChiSts() > STSchi2    || mu_mn->GetChiSts() < 0 )    continue;
+	   if(mu_mn->GetChiMuch()> MUCHchi2   || mu_mn->GetChiMuch() < 0)    continue;
+	   if(mu_mn->GetNTofHits() < 1)continue;
+	   if(mu_mn->GetNMuchHits()< 1)continue;
+	   if(M > Mcut)continue;
+	   */
+	   Chi2Vertex = mu_mn->GetChiToVertex();
+	   Chi2STS    = mu_mn->GetChiSts();
+	   Chi2MUCH   = mu_mn->GetChiMuch();
+	   Chi2TRD    = mu_mn->GetChiTrd();
+	   
+	   NofSTS  = mu_mn->GetNStsHits();
+	   NofMUCH = mu_mn->GetNMuchHits();
+	   NofTRD  = mu_mn->GetNTrdHits();
+	   if(i==0)Signal->Fill(); else Bg->Fill(); 
+	 }
+	}
+      f->Close(); 
+    }}
+ 
+   Int_t type;
+   
+   TTree *simu = new TTree("MonteCarlo", "Filtered Monte Carlo Events");
+   simu->Branch("P", &P, "P/D", 20000000);
+   simu->Branch("M", &M, "M/D", 20000000);
+   simu->Branch("Chi2Vertex",&Chi2Vertex,"Chi2Vertex/D", 20000000);
+   simu->Branch("Chi2STS",   &Chi2STS,   "Chi2STS/D", 20000000);
+   simu->Branch("Chi2MUCH",  &Chi2MUCH,  "Chi2MUCH/D", 20000000);
+   simu->Branch("Chi2TRD",  &Chi2TRD,  "Chi2TRD/D", 20000000);
+   simu->Branch("NofSTS", &NofSTS, "NofSTS/I", 20000000);
+   simu->Branch("NofMUCH",&NofMUCH,"NofMUCH/I", 20000000);
+   simu->Branch("NofTRD", &NofTRD, "NofTRD/I", 20000000);
+   simu->Branch("type",   &type,   "type/I", 20000000);
+
+   type=1; // 1 = signal, 0 = background
+   Int_t i;
+   for (i = 0; i < Signal->GetEntries(); i++) {
+      Signal->GetEntry(i);
+      simu->Fill();
+   }
+
+   type = 0;
+   for (i = 0; i < Bg->GetEntries(); i++) {
+      Bg->GetEntry(i);
+      simu->Fill();
+   }
+   
+   name.Form("@P,@M,@Chi2Vertex,@Chi2STS,@Chi2MUCH,@Chi2TRD,@NofSTS,@NofMUCH,@NofTRD:%d:type",neurons);
+   TMultiLayerPerceptron *mlp = new TMultiLayerPerceptron(name.Data(),simu,"Entry$%2");
+   
+   mlp->Train(ntrain, "text,graph,update=10");  
+   name.Form("muid_ann_%d_%s_weights.txt",neurons,setup.Data());
+   mlp->DumpWeights(name);
+   
+   TCanvas* mlpa_canvas = new TCanvas("mlpa_canvas","Network analysis");
+   mlpa_canvas->Divide(2,2);
+   TMLPAnalyzer ana(mlp);
+   ana.GatherInformations();
+   ana.CheckNetwork();
+   mlpa_canvas->cd(1);
+   ana.DrawDInputs();
+   mlpa_canvas->cd(2);
+   mlp->Draw();
+   mlpa_canvas->cd(3);
+   ana.DrawNetwork(0,"type==1","type==0");
+   mlpa_canvas->cd(4);
+
+   TH1F *bg = new TH1F("bgh", "NN output", 50, -.5, 1.5);
+   TH1F *sig = new TH1F("sigh", "NN output", 50, -.5, 1.5);
+   bg->SetDirectory(0);
+   sig->SetDirectory(0);
+   
+   Double_t params[9];
+  
+   for (i = 0; i < Bg->GetEntries(); i++) {
+      Bg->GetEntry(i);
+      params[0] = P;
+      params[1] = M;
+      params[2] = Chi2Vertex;
+      params[3] = Chi2STS;
+      params[4] = Chi2MUCH;
+      params[5] = Chi2TRD;
+      
+      params[6] = (Double_t)NofSTS;
+      params[7] = (Double_t)NofMUCH;
+      params[8] = (Double_t)NofTRD;
+          
+      bg->Fill(mlp->Evaluate(0, params));
+   }
+  
+   for (i = 0; i < Signal->GetEntries(); i++) {
+      Signal->GetEntry(i);
+      params[0] = P;
+      params[1] = M;
+      params[2] = Chi2Vertex;
+      params[3] = Chi2STS;
+      params[4] = Chi2MUCH;
+      params[5] = Chi2TRD;
+      
+      params[6] = (Double_t)NofSTS;
+      params[7] = (Double_t)NofMUCH;
+      params[8] = (Double_t)NofTRD;
+      
+      sig->Fill(mlp->Evaluate(0,params));
+   }   
+   
+   bg->SetLineColor(kBlue);
+   bg->SetFillStyle(3008);   bg->SetFillColor(kBlue);
+   sig->SetLineColor(kRed);
+   sig->SetFillStyle(3003); sig->SetFillColor(kRed);
+   bg->SetStats(0);
+   sig->SetStats(0);
+   bg->Draw();
+   sig->Draw("same");
+   TLegend *legend = new TLegend(.75, .80, .95, .95);
+   legend->AddEntry(bg, "Background");
+   legend->AddEntry(sig, "Signal (#mu)");
+   legend->Draw();
+   mlpa_canvas->cd(0);
+   
+   name.Form("ann_%d_%s_canvas.root",neurons,setup.Data());
+   TFile *FFF = new TFile(name,"recreate");
+   mlpa_canvas->Write();
+   FFF->Close();   
+}
+
+
+
-- 
GitLab