Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-07 08:12:24

0001 #ifndef INTTEta_h
0002 #define INTTEta_h
0003 
0004 #include "INTTXYvtxEvt.h"
0005 
0006 class INTTEta : public INTTXYvtxEvt
0007 {
0008     public:
0009         INTTEta(string run_type, string out_folder_directory, pair<double,double> beam_origin, int geo_mode_id, double phi_diff_cut = 0.11, pair<double, double> DCA_cut = {-1,1}, int N_clu_cutl = 20, int N_clu_cut = 10000, bool draw_event_display = true, double peek = 3.32405, double angle_diff_new_l = 0.0, double angle_diff_new_r = 3, bool print_message_opt = true):
0010         INTTXYvtxEvt(run_type, out_folder_directory, beam_origin, geo_mode_id, phi_diff_cut, DCA_cut, N_clu_cutl, N_clu_cut, draw_event_display, peek, angle_diff_new_l, angle_diff_new_r, print_message_opt, 2.5, 9)
0011         {
0012             track_cluster_ratio_1D.clear();
0013             track_cluster_ratio_1D_MC.clear();
0014             dNdeta_1D.clear();
0015             track_eta_phi_2D.clear();
0016             track_eta_z_2D.clear();
0017             dNdeta_1D_MC.clear();
0018             final_dNdeta_1D.clear();
0019             final_dNdeta_1D_MC.clear();
0020             final_dNdeta_multi_1D.clear();
0021             track_eta_z_2D_MC.clear();
0022             track_delta_phi_1D.clear();
0023             track_DCA_distance.clear();
0024             final_track_delta_phi_1D.clear();
0025             final_track_multi_delta_phi_1D.clear();
0026             eta_z_region_hist_2D_MC.clear();
0027 
0028             proto_pair_index.clear();
0029             proto_pair_delta_phi_abs.clear();
0030             proto_pair_delta_phi.clear();
0031             inner_used_clu.clear();
0032             outer_used_clu.clear();
0033             inner_used_mega_clu.clear();
0034             outer_used_mega_clu.clear();
0035 
0036             Mega_inner_clu_pair_index.clear();
0037             Mega_inner_clu_delta_phi_abs.clear();
0038             Mega_inner_clu_phi.clear();
0039             Mega_outer_clu_pair_index.clear();
0040             Mega_outer_clu_delta_phi_abs.clear();
0041             Mega_outer_clu_phi.clear();
0042 
0043             clu4_mega_pair_index.clear();
0044             clu4_mega_pair_delta_phi_abs.clear();
0045             clu3_inner_mega_pair_index.clear();
0046             clu3_inner_mega_pair_delta_phi_abs.clear();
0047             clu3_outer_mega_pair_index.clear();
0048             clu3_outer_mega_pair_delta_phi_abs.clear();
0049 
0050             eta_z_convert_map_index = 0;
0051             eta_z_convert_map.clear();
0052             eta_z_convert_inverse_map.clear();
0053 
0054             out_track_eta_d.clear();
0055             out_track_eta_i.clear();
0056             out_track_delta_phi_d.clear();
0057             clu_multi_used_tight = 0;
0058             clu_multi_used_loose = 0;
0059             NClu3_track_count = 0;
0060             NClu4_track_count = 0;
0061             effective_total_NClus = 0;
0062 
0063             cout<<"test: "<<centrality_region_size<<" "<<eta_region_size<<endl;
0064             good_tracklet_counting = std::vector<std::vector<int>>(centrality_region_size, std::vector<int>(eta_region_size, 0));
0065             good_tracklet_multi_counting = std::vector<std::vector<int>>(centrality_region_size, std::vector<int>(eta_region_size, 0));
0066 
0067             std::fill(std::begin(inner_clu_phi_map), std::end(inner_clu_phi_map), std::vector<pair<bool,clu_info>>());
0068             std::fill(std::begin(outer_clu_phi_map), std::end(outer_clu_phi_map), std::vector<pair<bool,clu_info>>());
0069 
0070             // note : 10 is for the centrality bin
0071             N_GoodEvent_vec = vector<long long>(10,0); // todo : if the centrality bin is changed, the vector should be updated 
0072 
0073             InitHist();
0074             InitGraph();
0075             InitTree();
0076 
0077             for (int i = 0; i < z_region.size() - 1; i++) // note : Y axis in the TH2F
0078             {
0079                 for (int j = 0; j < eta_region.size() - 1; j++) // note : X axis in the TH2F
0080                 {
0081                     eta_z_convert_map[std::to_string(j+1) + "_" + std::to_string(i+1)] = eta_z_convert_map_index;
0082                     eta_z_convert_inverse_map[eta_z_convert_map_index] = {j+1, i+1};
0083                     eta_z_convert_map_index += 1;
0084                 }
0085             }
0086 
0087             out_folder_directory_evt = out_folder_directory + "/evt_display";
0088             system(Form("mkdir %s", out_folder_directory_evt.c_str()));
0089 
0090             loop_NGoodPair = 0;
0091             evt_NTrack = 0;
0092             evt_NTrack_MC = 0;
0093             N_GoodEvent = 0;
0094             return;
0095         };
0096         
0097         void ProcessEvt(int event_i, vector<clu_info> temp_sPH_inner_nocolumn_vec, vector<clu_info> temp_sPH_outer_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_rz_vec, int NvtxMC, vector<double> TrigvtxMC, bool PhiCheckTag, Long64_t bco_full, pair<double,double> evt_z, int centrality_bin, vector<vector<float>> true_track_info); 
0098         // void ProcessEvtMC(int event_i, vector<float> true_track_info, vector<double> TrigvtxMC);
0099         void ClearEvt() override;
0100         void PrintPlots() override;
0101         void EndRun() override;
0102 
0103     protected:
0104         // note : {5, 15, 25, 35, 45, 55, 65, 75, 85, 95, inclusive}
0105         // note : the following 1D-histogram arrays are declared based on the centrality_region
0106         vector<TH1F *> track_cluster_ratio_1D; 
0107         vector<TH1F *> track_cluster_ratio_1D_MC;
0108         vector<TH1F *> dNdeta_1D;
0109         vector<TH2F *> track_eta_phi_2D;
0110         vector<TH2F *> track_eta_z_2D;
0111 
0112         vector<TH1F *> dNdeta_1D_MC;
0113         vector<TH2F *> track_eta_z_2D_MC;
0114 
0115         vector<TH1F *> track_delta_eta_1D;
0116         vector<TH1F *> track_delta_eta_1D_post; 
0117         vector<TH1F *> track_delta_phi_1D;
0118         vector<TH1F *> track_DCA_distance;
0119         vector<TH2F *> track_phi_DCA_2D;
0120 
0121         vector<TH2F *> track_DeltaPhi_eta_2D;
0122         vector<TH2F *> track_DeltaPhi_DeltaEta_2D;
0123 
0124         vector<TH1F *> final_dNdeta_1D;
0125         vector<TH1F *> final_dNdeta_multi_1D;
0126         vector<TH1F *> final_dNdeta_1D_MC;
0127 
0128         vector<TH1F *> track_ratio_1D; // note : N reco track /N true track
0129 
0130         // note : up to here ----------------------------- 
0131         vector<vector<TH1F *>> final_track_delta_phi_1D;       // note : centrality_bin and different eta
0132         vector<vector<TH1F *>> final_track_multi_delta_phi_1D; // note : centrality_bin and different eta
0133 
0134         TH2F * track_correlation_2D;
0135         TH2F * track_ratio_2D;
0136         
0137 
0138         TH2F * reco_eta_correlation_2D;
0139         TH2F * reco_eta_diff_reco3P_2D;
0140         TH1F * reco_eta_diff_1D;
0141 
0142         TH2F * clu_used_centrality_2D;
0143 
0144         TH1F * cluster4_track_phi_1D;
0145         TH1F * cluster3_all_track_phi_1D;
0146         TH1F * cluster3_inner_track_phi_1D; // note : inner has Mega cluster
0147         TH1F * cluster3_outer_track_phi_1D; // note : outer has Mega cluster
0148         TH2F * NClu3_track_centrality_2D;
0149         TH2F * NClu4_track_centrality_2D;
0150         int NClu3_track_count;
0151         int NClu4_track_count;
0152         
0153         // vector<vector<int>> good_tracklet_counting;
0154         
0155         TGraph * evt_reco_track_gr_All; // note : all the tracklets in one event, no selection
0156         TGraph * evt_reco_track_gr_PhiLoose; // note : the tracklets that pass the loose phi selection
0157         TGraph * evt_reco_track_gr_Z; // note : the tracklets that pass the z selection and the loose phi selection
0158         TGraph * evt_reco_track_gr_ZDCA; // note : the tracklets that pass the z and phi selection, and the loose phi selection
0159         TGraph * evt_reco_track_gr_ZDCAPhi; // note : the tracklets that pass the z, phi and DCA selection, and the loose phi selection
0160         TGraph * evt_true_track_gr; // note : the true tracklets in one event, no selection
0161 
0162         vector<pair<bool,clu_info>> inner_clu_phi_map[360]; // note: phi
0163         vector<pair<bool,clu_info>> outer_clu_phi_map[360]; // note: phi
0164 
0165         string out_folder_directory_evt;
0166 
0167         int draw_evt_cut = 15; // todo : change the cut value (number of true track)
0168         int print_plot_ratio = 3; // note : print the event display every 3 events
0169         int inner_NClu;
0170         int outer_NClu;
0171         int loop_NGoodPair;
0172         int evt_NTrack;
0173         int evt_NTrack_MC;
0174         long long N_GoodEvent;
0175         int clu_multi_used_loose;
0176         int clu_multi_used_tight;
0177         int effective_total_NClus;
0178         double pair_delta_phi;
0179         pair<int,int> pair_outer_index;
0180         // double INTT_layer_R = 71.88; // note: the innermost, B0L0, layer radius
0181         double INTT_layer_R[4] = {71.88, 77.32, 96.8, 102.62}; // note : the radii of the INTT layers
0182         
0183         vector<long long> N_GoodEvent_vec;
0184         pair<double,double> Get_eta_pair;
0185         vector<vector<double>> final_eta_entry; // note : not used
0186 
0187 
0188         vector<vector<int>> proto_pair_index;
0189         vector<vector<double>> proto_pair_delta_phi;
0190         vector<double> proto_pair_delta_phi_abs;
0191         map<string,int> inner_used_clu;
0192         map<string,int> outer_used_clu;
0193 
0194         // note : for the three/four cluster tracklet 
0195         // note : we have to make the Mega-cluster pair first 
0196         vector<vector<int>> Mega_inner_clu_pair_index;
0197         vector<double> Mega_inner_clu_delta_phi_abs;
0198         vector<double> Mega_inner_clu_phi;
0199         vector<vector<int>> Mega_outer_clu_pair_index;
0200         vector<double> Mega_outer_clu_delta_phi_abs;
0201         vector<double> Mega_outer_clu_phi;
0202         map<string,int> inner_used_mega_clu;
0203         map<string,int> outer_used_mega_clu;
0204         
0205         // note : for the four cluster tracklet Mega inner and Mega outer
0206         vector<vector<int>> clu4_mega_pair_index;
0207         vector<double> clu4_mega_pair_delta_phi_abs;
0208         // note : for the three cluster tracklet Mega inner and single outer
0209         vector<vector<int>> clu3_inner_mega_pair_index;
0210         vector<double> clu3_inner_mega_pair_delta_phi_abs;
0211         // note : for the three cluster tracklet single inner and Mega outer
0212         vector<vector<int>> clu3_outer_mega_pair_index;
0213         vector<double> clu3_outer_mega_pair_delta_phi_abs;
0214 
0215         double Clus_InnerPhi_Offset_1;
0216         double Clus_InnerPhi_Offset_2;
0217         double Clus_OuterPhi_Offset_1;
0218         double Clus_OuterPhi_Offset_2;
0219 
0220 
0221         TH2F * track_cluster_ratio_multiplicity_2D; // note : x : NClus / NTracks, y : ratio
0222         TH2F * track_cluster_ratio_multiplicity_2D_MC; // note : x : NClus / NTracks, y : ratio
0223         TGraphErrors * track_gr;
0224 
0225         TFile * out_file;
0226         TTree * tree_out;
0227         int out_eID;
0228         int out_evt_centrality_bin;
0229         double out_evt_zvtx;
0230         vector<double> out_track_eta_d;
0231         vector<int> out_track_eta_i;
0232         vector<double> out_track_delta_phi_d;
0233 
0234         // todo : if the centrality bin is changed, the following map and vector should be updated
0235         map<int,int> centrality_map = {
0236             {5, 0},
0237             {15, 1},
0238             {25, 2},
0239             {35, 3},
0240             {45, 4},
0241             {55, 5},
0242             {65, 6},
0243             {75, 7},
0244             {85, 8},
0245             {95, 9}
0246         };
0247 
0248         vector<string> centrality_region = {
0249             "0-5%",
0250             "5-15%",
0251             "15-25%",
0252             "25-35%",
0253             "35-45%",
0254             "45-55%",
0255             "55-65%",
0256             "65-75%",
0257             "75-85%",
0258             "85-95%",
0259             "0-95%"
0260         };
0261 
0262         TH1F * eta_region_hist;
0263         TH2F * eta_z_region_hist_2D_map;
0264         vector<TH2F *> eta_z_region_hist_2D_MC; // note : this is for filling the MC tracklet
0265         TH2F * MBin_Z_hist_2D; // note : this fills the number of events as a function of z vertex and centrality
0266         vector<double> eta_region = { // todo: if the eta region is changed, the following vector should be updated
0267             -3.0,
0268             -2.8,
0269             -2.6,
0270             -2.4,
0271             -2.2,
0272             -2,
0273             -1.8,
0274             -1.6,
0275             -1.4,
0276             -1.2,
0277             -1,
0278             -0.8,
0279             -0.6,
0280             -0.4,
0281             -0.2,
0282             0,
0283             0.2,
0284             0.4,
0285             0.6,
0286             0.8,
0287             1,
0288             1.2,
0289             1.4,
0290             1.6,
0291             1.8,
0292             2,
0293             2.2,
0294             2.4,
0295             2.6,
0296             2.8,
0297             3
0298         };
0299 
0300         vector<double> z_region = { // todo: if the z region is changed, the following vector should be updated
0301             -420, // note unit : mm
0302             -380,
0303             -340,
0304             -300,
0305             -260,
0306             -220, // note : this part is the peak region
0307             -180, // note : this part is the peak region
0308             -140,
0309             -100,
0310             -60,
0311             -20,
0312             20
0313         };
0314 
0315         // note : when filling in a z-eta pair, TH2F returns a int, we have a function to convert that number into the index position in X and Y
0316         // note : Once we have the position index in X and Y, we then convert the X and Y into the index for 1D array
0317         int eta_z_convert_map_index;
0318         map<string,int> eta_z_convert_map;
0319         map<int, pair<int,int>> eta_z_convert_inverse_map;
0320 
0321 
0322         // todo : change the single region cut here
0323         double signal_region = 1.; // note : the signal region of the delta phi distribution 
0324         // todo : change the tight zvtx cut here 
0325         // double tight_zvtxL = -220; // note : unit : mm
0326         // double tight_zvtxR = -180;
0327         int tight_zvtx_bin = 6; // todo : it can be run by run dependent // note : select the bin that you want to have the quick result out
0328 
0329         const int centrality_region_size = centrality_region.size();
0330         const int  eta_region_size = eta_region.size() - 1;
0331         std::vector<std::vector<int>> good_tracklet_counting;
0332         std::vector<std::vector<int>> good_tracklet_multi_counting;
0333         
0334         void InitHist();
0335         void InitGraph();
0336         void InitTree();
0337 
0338         double grEY_stddev(TGraphErrors * input_grr);
0339         pair<double, double> mirrorPolynomial(double a, double b);
0340         pair<double,double> Get_eta(vector<double>p0, vector<double>p1, vector<double>p2);
0341         double convertTo360(double radian);
0342         void print_evt_plot(int event_i, int NTrueTrack, int innerNClu, int outerNClu);
0343         double get_clu_eta(vector<double> vertex, vector<double> clu_pos);
0344         double get_dist_offset(TH1F * hist_in, int check_N_bin);
0345         double get_delta_phi(double angle_1, double angle_2);
0346         double get_track_phi(double inner_clu_phi_in, double delta_phi_in);
0347         pair<int,int> GetTH2BinXY(TH2F * hist_in, int binglobal);
0348         double GetTH2Index1D(pair<int,int> XY_index, TH2F * hist2D_in);
0349         void DrawEtaZGrid();
0350 };
0351 
0352 void INTTEta::InitHist()
0353 {
0354     // double Eta_NBin = 145;
0355     // double Eta_Min = -2.9;
0356     // double Eta_Max = 2.9;
0357 
0358     eta_region_hist = new TH1F("","", eta_region.size() - 1, &eta_region[0]);
0359     eta_region_hist -> GetXaxis() -> SetTitle("#eta");
0360     eta_region_hist -> GetYaxis() -> SetTitle("Entry");
0361 
0362     eta_z_region_hist_2D_map = new TH2F("","", eta_region.size() - 1, &eta_region[0], z_region.size() - 1, &z_region[0]);
0363     eta_z_region_hist_2D_map -> GetXaxis() -> SetTitle("#eta");
0364     eta_z_region_hist_2D_map -> GetYaxis() -> SetTitle("Z vertex [mm]");
0365 
0366     MBin_Z_hist_2D = new TH2F("","", centrality_region.size(), 0, centrality_region.size(), z_region.size() - 1, &z_region[0]); // todo : if the centrality bin is changed, should check here
0367     MBin_Z_hist_2D -> GetXaxis() -> SetTitle("Centrality bin");
0368     MBin_Z_hist_2D -> GetYaxis() -> SetTitle("Z vertex [mm]");
0369 
0370     // todo: change the fine eta binning here
0371     double Eta_NBin = 61;
0372     double Eta_Min = -3.05;
0373     double Eta_Max = 3.05;
0374 
0375     final_track_delta_phi_1D = vector<vector<TH1F *>>(centrality_region.size());
0376     final_track_multi_delta_phi_1D = vector<vector<TH1F *>>(centrality_region.size());
0377     final_eta_entry = vector<vector<double>>(centrality_region.size());
0378 
0379     for (int i = 0; i < centrality_region.size(); i++) 
0380     {
0381         eta_z_region_hist_2D_MC.push_back( new TH2F("","", eta_region.size() - 1, &eta_region[0], z_region.size() - 1, &z_region[0]) );
0382         eta_z_region_hist_2D_MC[i] -> GetXaxis() -> SetTitle("#eta");
0383         eta_z_region_hist_2D_MC[i] -> GetYaxis() -> SetTitle("Z vertex [mm]");
0384         eta_z_region_hist_2D_MC[i] -> GetXaxis() -> SetNdivisions(505);
0385 
0386         track_cluster_ratio_1D.push_back(new TH1F("","track_cluster_ratio_1D",200,0,15));
0387         track_cluster_ratio_1D[i] -> GetXaxis() -> SetTitle("NClus / NTracks");
0388         track_cluster_ratio_1D[i] -> GetYaxis() -> SetTitle("Entry");
0389         track_cluster_ratio_1D[i] -> GetXaxis() -> SetNdivisions(505);
0390 
0391         track_cluster_ratio_1D_MC.push_back(new TH1F("","track_cluster_ratio_1D_MC",200,0,15));
0392         track_cluster_ratio_1D_MC[i] -> GetXaxis() -> SetTitle("NClus / NTrackMC");
0393         track_cluster_ratio_1D_MC[i] -> GetYaxis() -> SetTitle("Entry");
0394         track_cluster_ratio_1D_MC[i] -> GetXaxis() -> SetNdivisions(505);
0395 
0396         dNdeta_1D.push_back(new TH1F("","",Eta_NBin, Eta_Min, Eta_Max));
0397         dNdeta_1D[i] -> SetMarkerStyle(20);
0398         dNdeta_1D[i] -> SetMarkerSize(0.8);
0399         dNdeta_1D[i] -> SetMarkerColor(TColor::GetColor("#1A3947"));
0400         dNdeta_1D[i] -> SetLineColor(TColor::GetColor("#1A3947"));
0401         dNdeta_1D[i] -> SetLineWidth(2);
0402         dNdeta_1D[i] -> GetYaxis() -> SetTitle("dN_{ch}/d#eta");
0403         dNdeta_1D[i] -> GetXaxis() -> SetTitle("#eta");
0404         dNdeta_1D[i] -> GetYaxis() -> SetRangeUser(0,50);
0405         dNdeta_1D[i] -> SetTitleSize(0.06, "X");
0406         dNdeta_1D[i] -> SetTitleSize(0.06, "Y");
0407         dNdeta_1D[i] -> GetXaxis() -> SetTitleOffset (0.71);
0408         dNdeta_1D[i] -> GetYaxis() -> SetTitleOffset (1.1);
0409         dNdeta_1D[i] -> GetXaxis() -> CenterTitle(true);
0410         dNdeta_1D[i] -> GetYaxis() -> CenterTitle(true);
0411 
0412         dNdeta_1D_MC.push_back(new TH1F("","",Eta_NBin, Eta_Min, Eta_Max));
0413         dNdeta_1D_MC[i] -> SetMarkerStyle(20);
0414         dNdeta_1D_MC[i] -> SetMarkerSize(0.8);
0415         dNdeta_1D_MC[i] -> SetMarkerColor(TColor::GetColor("#1A3947"));
0416         dNdeta_1D_MC[i] -> SetLineColor(TColor::GetColor("#1A3947"));
0417         dNdeta_1D_MC[i] -> SetLineWidth(2);
0418         dNdeta_1D_MC[i] -> GetYaxis() -> SetTitle("dN_{ch}/d#eta");
0419         dNdeta_1D_MC[i] -> GetXaxis() -> SetTitle("#eta");
0420         dNdeta_1D_MC[i] -> GetYaxis() -> SetRangeUser(0,50);
0421         dNdeta_1D_MC[i] -> SetTitleSize(0.06, "X");
0422         dNdeta_1D_MC[i] -> SetTitleSize(0.06, "Y");
0423         dNdeta_1D_MC[i] -> GetXaxis() -> SetTitleOffset (0.71);
0424         dNdeta_1D_MC[i] -> GetYaxis() -> SetTitleOffset (1.1);
0425         dNdeta_1D_MC[i] -> GetXaxis() -> CenterTitle(true);
0426         dNdeta_1D_MC[i] -> GetYaxis() -> CenterTitle(true);
0427 
0428         final_dNdeta_1D.push_back(new TH1F("","",eta_region.size() - 1, &eta_region[0]));
0429         final_dNdeta_1D[i] -> SetMarkerStyle(20);
0430         final_dNdeta_1D[i] -> SetMarkerSize(0.8);
0431         final_dNdeta_1D[i] -> SetMarkerColor(TColor::GetColor("#1A3947"));
0432         final_dNdeta_1D[i] -> SetLineColor(TColor::GetColor("#1A3947"));
0433         final_dNdeta_1D[i] -> SetLineWidth(2);
0434         final_dNdeta_1D[i] -> GetYaxis() -> SetTitle("dN_{ch}/d#eta");
0435         final_dNdeta_1D[i] -> GetXaxis() -> SetTitle("#eta");
0436         final_dNdeta_1D[i] -> GetYaxis() -> SetRangeUser(0,50);
0437         final_dNdeta_1D[i] -> SetTitleSize(0.06, "X");
0438         final_dNdeta_1D[i] -> SetTitleSize(0.06, "Y");
0439         final_dNdeta_1D[i] -> GetXaxis() -> SetTitleOffset (0.71);
0440         final_dNdeta_1D[i] -> GetYaxis() -> SetTitleOffset (1.1);
0441         final_dNdeta_1D[i] -> GetXaxis() -> CenterTitle(true);
0442         final_dNdeta_1D[i] -> GetYaxis() -> CenterTitle(true);
0443 
0444         final_dNdeta_multi_1D.push_back(new TH1F("","",eta_region.size() - 1, &eta_region[0]));
0445         final_dNdeta_multi_1D[i] -> SetMarkerStyle(20);
0446         final_dNdeta_multi_1D[i] -> SetMarkerSize(0.8);
0447         final_dNdeta_multi_1D[i] -> SetMarkerColor(TColor::GetColor("#c48045"));
0448         final_dNdeta_multi_1D[i] -> SetLineColor(TColor::GetColor("#c48045"));
0449         final_dNdeta_multi_1D[i] -> SetLineWidth(2);
0450         final_dNdeta_multi_1D[i] -> GetYaxis() -> SetTitle("dN_{ch}/d#eta");
0451         final_dNdeta_multi_1D[i] -> GetXaxis() -> SetTitle("#eta");
0452         final_dNdeta_multi_1D[i] -> GetYaxis() -> SetRangeUser(0,50);
0453         final_dNdeta_multi_1D[i] -> SetTitleSize(0.06, "X");
0454         final_dNdeta_multi_1D[i] -> SetTitleSize(0.06, "Y");
0455         final_dNdeta_multi_1D[i] -> GetXaxis() -> SetTitleOffset (0.71);
0456         final_dNdeta_multi_1D[i] -> GetYaxis() -> SetTitleOffset (1.1);
0457         final_dNdeta_multi_1D[i] -> GetXaxis() -> CenterTitle(true);
0458         final_dNdeta_multi_1D[i] -> GetYaxis() -> CenterTitle(true);
0459 
0460         final_dNdeta_1D_MC.push_back(new TH1F("","",eta_region.size() - 1, &eta_region[0]));
0461         final_dNdeta_1D_MC[i] -> SetMarkerStyle(20);
0462         final_dNdeta_1D_MC[i] -> SetMarkerSize(0.8);
0463         final_dNdeta_1D_MC[i] -> SetMarkerColor(TColor::GetColor("#1A3947"));
0464         final_dNdeta_1D_MC[i] -> SetLineColor(TColor::GetColor("#1A3947"));
0465         final_dNdeta_1D_MC[i] -> SetLineWidth(2);
0466         final_dNdeta_1D_MC[i] -> GetYaxis() -> SetTitle("dN_{ch}/d#eta");
0467         final_dNdeta_1D_MC[i] -> GetXaxis() -> SetTitle("#eta");
0468         final_dNdeta_1D_MC[i] -> GetYaxis() -> SetRangeUser(0,50);
0469         final_dNdeta_1D_MC[i] -> SetTitleSize(0.06, "X");
0470         final_dNdeta_1D_MC[i] -> SetTitleSize(0.06, "Y");
0471         final_dNdeta_1D_MC[i] -> GetXaxis() -> SetTitleOffset (0.71);
0472         final_dNdeta_1D_MC[i] -> GetYaxis() -> SetTitleOffset (1.1);
0473         final_dNdeta_1D_MC[i] -> GetXaxis() -> CenterTitle(true);
0474         final_dNdeta_1D_MC[i] -> GetYaxis() -> CenterTitle(true);
0475 
0476         track_eta_phi_2D.push_back(new TH2F("","track_eta_phi_2D", 200, -40, 400, Eta_NBin, Eta_Min, Eta_Max));
0477         track_eta_phi_2D[i] -> GetXaxis() -> SetTitle("tracklet #phi");
0478         track_eta_phi_2D[i] -> GetYaxis() -> SetTitle("tracklet #eta");
0479         track_eta_phi_2D[i] -> GetXaxis() -> SetNdivisions(505);
0480 
0481         track_eta_z_2D.push_back(new TH2F("","track_eta_z_2D", Eta_NBin, Eta_Min, Eta_Max, 300, -420, 20));
0482         track_eta_z_2D[i] -> GetXaxis() -> SetTitle("tracklet #eta");
0483         track_eta_z_2D[i] -> GetYaxis() -> SetTitle("z vertex [mm]");
0484         track_eta_z_2D[i] -> GetXaxis() -> SetNdivisions(505);
0485 
0486         track_eta_z_2D_MC.push_back(new TH2F("","track_eta_z_2D_MC", Eta_NBin, Eta_Min, Eta_Max, 300, -420, 20));
0487         track_eta_z_2D_MC[i] -> GetXaxis() -> SetTitle("track #eta");
0488         track_eta_z_2D_MC[i] -> GetYaxis() -> SetTitle("z vertex [mm]");
0489         track_eta_z_2D_MC[i] -> GetXaxis() -> SetNdivisions(505);
0490 
0491         track_delta_eta_1D.push_back(new TH1F("","track_delta_eta_1D", 200, -1.5, 1.5));
0492         track_delta_eta_1D[i] -> GetXaxis() -> SetTitle("Clus #Delta#eta");
0493         track_delta_eta_1D[i] -> GetYaxis() -> SetTitle("Entry");
0494         track_delta_eta_1D[i] -> GetXaxis() -> SetNdivisions(505);
0495 
0496         track_delta_eta_1D_post.push_back(new TH1F("","track_delta_eta_1D_ potrack_delta_eta_1D_post", 200, -1.5, 1.5));
0497         track_delta_eta_1D_post[i] -> GetXaxis() -> SetTitle("Clus #Delta#eta");
0498         track_delta_eta_1D_post[i] -> GetYaxis() -> SetTitle("Entry");
0499         track_delta_eta_1D_post[i] -> GetXaxis() -> SetNdivisions(505);
0500 
0501         track_delta_phi_1D.push_back(new TH1F("","track_delta_phi_1D", 200, -1.5, 1.5));
0502         track_delta_phi_1D[i] -> GetXaxis() -> SetTitle("Clus #Delta#phi [degree]");
0503         track_delta_phi_1D[i] -> GetYaxis() -> SetTitle("Entry");
0504         track_delta_phi_1D[i] -> GetXaxis() -> SetNdivisions(505);
0505 
0506         track_DCA_distance.push_back(new TH1F("","track_DCA_distance", 200, -5, 5));
0507         track_DCA_distance[i] -> GetXaxis() -> SetTitle("DCA distance [mm]");
0508         track_DCA_distance[i] -> GetYaxis() -> SetTitle("Entry");
0509         track_DCA_distance[i] -> GetXaxis() -> SetNdivisions(505);
0510 
0511         track_phi_DCA_2D.push_back(new TH2F("","track_phi_DCA_2D", 200, -1.5, 1.5, 200, -3, 3));
0512         track_phi_DCA_2D[i] -> GetXaxis() -> SetTitle("Clus #Delta#phi [degree]");
0513         track_phi_DCA_2D[i] -> GetYaxis() -> SetTitle("DCA distance [mm]");
0514         track_phi_DCA_2D[i] -> GetXaxis() -> SetNdivisions(505);
0515 
0516         track_ratio_1D.push_back(new TH1F("","track_ratio_1D", 200, 0, 1.5));
0517         track_ratio_1D[i] -> GetXaxis() -> SetTitle("N reco track / N true track");
0518         track_ratio_1D[i] -> GetYaxis() -> SetTitle("Entry");
0519         track_ratio_1D[i] -> GetXaxis() -> SetNdivisions(505);
0520 
0521         track_DeltaPhi_eta_2D.push_back(new TH2F("","track_DeltaPhi_eta_2D", 200, -1.5, 1.5, 200, -4, 4));
0522         track_DeltaPhi_eta_2D[i] -> GetXaxis() -> SetTitle("Clus #Delta#phi [degree]");
0523         track_DeltaPhi_eta_2D[i] -> GetYaxis() -> SetTitle("Tracklet #eta");
0524         track_DeltaPhi_eta_2D[i] -> GetXaxis() -> SetNdivisions(505);
0525 
0526         track_DeltaPhi_DeltaEta_2D.push_back(new TH2F("","track_DeltaPhi_DeltaEta_2D", 200, -1.5, 1.5, 200, -1, 1));
0527         track_DeltaPhi_DeltaEta_2D[i] -> GetXaxis() -> SetTitle("Clus #Delta#phi [degree]");
0528         track_DeltaPhi_DeltaEta_2D[i] -> GetYaxis() -> SetTitle("#Delta#eta");
0529         track_DeltaPhi_DeltaEta_2D[i] -> GetXaxis() -> SetNdivisions(505);
0530 
0531         final_track_delta_phi_1D[i].clear();
0532         final_track_multi_delta_phi_1D[i].clear();
0533         // for (int eta_i = 0; eta_i < eta_region.size() - 1; eta_i++)
0534         // note : now we try to do something inclusive, which means we open the z selection, try to have everything, and then we decide afterwards
0535         for (int eta_i = 0; eta_i < (eta_z_region_hist_2D_map -> GetNbinsX() * eta_z_region_hist_2D_map -> GetNbinsY()); eta_i++)
0536         {
0537             final_track_delta_phi_1D[i].push_back(new TH1F("","final_track_delta_phi_1D", 100, -3, 3));
0538             final_track_delta_phi_1D[i][eta_i] -> GetXaxis() -> SetTitle("Clus #Delta#phi [degree]");
0539             final_track_delta_phi_1D[i][eta_i] -> GetYaxis() -> SetTitle("Entry");
0540             final_track_delta_phi_1D[i][eta_i] -> GetXaxis() -> SetNdivisions(505);
0541 
0542             final_track_multi_delta_phi_1D[i].push_back(new TH1F("","final_track_multi_delta_phi_1D", 100, -3, 3));
0543             final_track_multi_delta_phi_1D[i][eta_i] -> GetXaxis() -> SetTitle("Clus #Delta#phi [degree]");
0544             final_track_multi_delta_phi_1D[i][eta_i] -> GetYaxis() -> SetTitle("Entry");
0545             final_track_multi_delta_phi_1D[i][eta_i] -> GetXaxis() -> SetNdivisions(505);
0546         }
0547     }
0548     
0549     track_cluster_ratio_multiplicity_2D = new TH2F("","track_cluster_ratio_multiplicity_2D", 200, 0, 9000, 200, 0, 15);
0550     track_cluster_ratio_multiplicity_2D -> GetXaxis() -> SetTitle("NClus");
0551     track_cluster_ratio_multiplicity_2D -> GetYaxis() -> SetTitle("NClus / NTracks");
0552     track_cluster_ratio_multiplicity_2D -> GetXaxis() -> SetNdivisions(505);
0553 
0554     track_cluster_ratio_multiplicity_2D_MC = new TH2F("","track_cluster_ratio_multiplicity_2D_MC", 200, 0, 9000, 200, 0, 15);
0555     track_cluster_ratio_multiplicity_2D_MC -> GetXaxis() -> SetTitle("NClus");
0556     track_cluster_ratio_multiplicity_2D_MC -> GetYaxis() -> SetTitle("NClus / NTracks");
0557     track_cluster_ratio_multiplicity_2D_MC -> GetXaxis() -> SetNdivisions(505);
0558 
0559     track_correlation_2D = new TH2F("","track_correlation_2D", 200, 0, 3000, 200, 0, 3000);
0560     track_correlation_2D -> GetXaxis() -> SetTitle("N true track");
0561     track_correlation_2D -> GetYaxis() -> SetTitle("N reco track");
0562     track_correlation_2D -> GetXaxis() -> SetNdivisions(505);
0563 
0564     track_ratio_2D = new TH2F("","track_ratio_2D", 200, 0, 3000, 200, 0, 2);
0565     track_ratio_2D -> GetXaxis() -> SetTitle("N true track");
0566     track_ratio_2D -> GetYaxis() -> SetTitle("N reco track/N true track");
0567     track_ratio_2D -> GetXaxis() -> SetNdivisions(505);
0568 
0569     reco_eta_correlation_2D = new TH2F("","reco_eta_correlation_2D", 200, -3, 3, 200, -3, 3);
0570     reco_eta_correlation_2D -> GetXaxis() -> SetTitle("Reco 3P #eta");
0571     reco_eta_correlation_2D -> GetYaxis() -> SetTitle("Reco 2P #eta");
0572     reco_eta_correlation_2D -> GetXaxis() -> SetNdivisions(505);
0573 
0574     reco_eta_diff_reco3P_2D = new TH2F("","reco_eta_diff_reco3P_2D", 200, -3, 3, 200, -0.35, 0.35);
0575     reco_eta_diff_reco3P_2D -> GetXaxis() -> SetTitle("Reco 3P #eta");
0576     reco_eta_diff_reco3P_2D -> GetYaxis() -> SetTitle("Reco #eta diff");
0577     reco_eta_diff_reco3P_2D -> GetXaxis() -> SetNdivisions(505);
0578 
0579     reco_eta_diff_1D = new TH1F("","reco_eta_diff_1D", 200, -0.35, 0.35);
0580     reco_eta_diff_1D -> GetXaxis() -> SetTitle("Reco #eta diff");
0581     reco_eta_diff_1D -> GetYaxis() -> SetTitle("Entry");
0582     reco_eta_diff_1D -> GetXaxis() -> SetNdivisions(505);
0583 
0584     cluster4_track_phi_1D = new TH1F("","cluster4_track_phi_1D", 200, -40, 400);
0585     cluster4_track_phi_1D -> GetXaxis() -> SetTitle("Tracklet #phi");
0586     cluster4_track_phi_1D -> GetYaxis() -> SetTitle("Entry");
0587     cluster4_track_phi_1D -> GetXaxis() -> SetNdivisions(505);
0588 
0589     cluster3_all_track_phi_1D = new TH1F("","cluster3_all_track_phi_1D", 200, -40, 400);
0590     cluster3_all_track_phi_1D -> GetXaxis() -> SetTitle("Tracklet #phi");
0591     cluster3_all_track_phi_1D -> GetYaxis() -> SetTitle("Entry");
0592     cluster3_all_track_phi_1D -> GetXaxis() -> SetNdivisions(505);
0593 
0594     cluster3_inner_track_phi_1D = new TH1F("","cluster3_inner_track_phi_1D", 200, -40, 400);
0595     cluster3_inner_track_phi_1D -> GetXaxis() -> SetTitle("Tracklet #phi");
0596     cluster3_inner_track_phi_1D -> GetYaxis() -> SetTitle("Entry");
0597     cluster3_inner_track_phi_1D -> GetXaxis() -> SetNdivisions(505);
0598 
0599     cluster3_outer_track_phi_1D = new TH1F("","cluster3_outer_track_phi_1D", 200, -40, 400);
0600     cluster3_outer_track_phi_1D -> GetXaxis() -> SetTitle("Tracklet #phi");
0601     cluster3_outer_track_phi_1D -> GetYaxis() -> SetTitle("Entry");
0602     cluster3_outer_track_phi_1D -> GetXaxis() -> SetNdivisions(505);
0603 
0604     clu_used_centrality_2D = new TH2F("","clu_used_centrality_2D", 200, 0, 8500, 10, 0, 10);
0605     clu_used_centrality_2D -> GetXaxis() -> SetTitle("NClus");
0606     clu_used_centrality_2D -> GetYaxis() -> SetTitle("N used each clu");
0607     clu_used_centrality_2D -> GetXaxis() -> SetNdivisions(505);
0608 
0609     NClu3_track_centrality_2D = new TH2F("","NClu3_track_centrality_2D", 10, 0, 10, 25, 0, 25);
0610     NClu3_track_centrality_2D -> GetXaxis() -> SetTitle("Centrality bin");
0611     NClu3_track_centrality_2D -> GetYaxis() -> SetTitle("N Clu3 tracks");
0612     NClu3_track_centrality_2D -> GetXaxis() -> SetNdivisions(505);
0613 
0614     NClu4_track_centrality_2D = new TH2F("","NClu4_track_centrality_2D", 10, 0, 10, 20, 0, 20);
0615     NClu4_track_centrality_2D -> GetXaxis() -> SetTitle("Centrality bin");
0616     NClu4_track_centrality_2D -> GetYaxis() -> SetTitle("N Clu4 tracks");
0617     NClu4_track_centrality_2D -> GetXaxis() -> SetNdivisions(505);
0618 
0619     cout<<" running ? in INTTEta, InitHist"<<endl;
0620 
0621 }
0622 
0623 void INTTEta::InitGraph()
0624 {
0625     track_gr = new TGraphErrors();
0626 
0627     evt_reco_track_gr_All = new TGraph();
0628     evt_reco_track_gr_All -> SetMarkerStyle(5);
0629     evt_reco_track_gr_All -> SetMarkerSize(1);
0630     evt_reco_track_gr_All -> SetMarkerColor(4);
0631 
0632     evt_reco_track_gr_PhiLoose = new TGraph();
0633     evt_reco_track_gr_PhiLoose -> SetMarkerStyle(5);
0634     evt_reco_track_gr_PhiLoose -> SetMarkerSize(1);
0635     evt_reco_track_gr_PhiLoose -> SetMarkerColor(4);
0636 
0637     evt_reco_track_gr_Z = new TGraph();
0638     evt_reco_track_gr_Z -> SetMarkerStyle(5);
0639     evt_reco_track_gr_Z -> SetMarkerSize(1);
0640     evt_reco_track_gr_Z -> SetMarkerColor(4);
0641     
0642     evt_reco_track_gr_ZDCA = new TGraph();
0643     evt_reco_track_gr_ZDCA -> SetMarkerStyle(5);
0644     evt_reco_track_gr_ZDCA -> SetMarkerSize(1);
0645     evt_reco_track_gr_ZDCA -> SetMarkerColor(4);
0646     
0647     evt_reco_track_gr_ZDCAPhi = new TGraph();
0648     evt_reco_track_gr_ZDCAPhi -> SetMarkerStyle(5);
0649     evt_reco_track_gr_ZDCAPhi -> SetMarkerSize(1);
0650     evt_reco_track_gr_ZDCAPhi -> SetMarkerColor(4);
0651 
0652     evt_true_track_gr = new TGraph();
0653     evt_true_track_gr -> SetMarkerStyle(20);
0654     evt_true_track_gr -> SetMarkerSize(1);
0655     // evt_true_track_gr -> SetMarkerColor(2);
0656     evt_true_track_gr -> SetMarkerColorAlpha(2,0.5);
0657 
0658 
0659     cout<<" running ? "<<endl;
0660     return;
0661 }
0662 
0663 void INTTEta::InitTree()
0664 {
0665     out_file = new TFile(Form("%s/INTT_final_DeltaPhi.root",out_folder_directory.c_str()),"RECREATE");
0666     tree_out =  new TTree ("tree_eta", "Tracklet eta info.");
0667     
0668     tree_out -> Branch("eID",&out_eID);
0669     tree_out -> Branch("Evt_centrality_bin",&out_evt_centrality_bin);
0670     tree_out -> Branch("Evt_zvtx", &out_evt_zvtx);
0671     tree_out -> Branch("Track_eta_d", &out_track_eta_d);
0672     tree_out -> Branch("Track_eta_i", &out_track_eta_i);
0673     tree_out -> Branch("Track_delta_phi_d", &out_track_delta_phi_d);
0674     
0675     return;
0676 }
0677 
0678 void INTTEta::print_evt_plot(int event_i, int NTrueTrack, int innerNClu, int outerNClu)
0679 {   
0680     c1 -> Clear();
0681     c1 -> Print( Form("%s/evt_track_eID_%i.pdf(", out_folder_directory_evt.c_str(), event_i) );
0682     c1 -> cd();
0683 
0684     evt_reco_track_gr_All -> GetXaxis() -> SetTitle("#eta");
0685     evt_reco_track_gr_All -> GetYaxis() -> SetTitle("#phi");
0686     evt_reco_track_gr_All -> GetXaxis() -> SetLimits(-3.5, 3.5);
0687     evt_reco_track_gr_All -> GetYaxis() -> SetRangeUser(-10, 420);
0688     evt_reco_track_gr_All -> GetXaxis() -> SetNdivisions(505);
0689     evt_reco_track_gr_All -> Draw("ap");
0690     evt_true_track_gr -> Draw("p same");
0691     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
0692     draw_text -> DrawLatex(0.21, 0.90, Form("NTrueTrack: %i, innerNClu: %i, outerNClu: %i", NTrueTrack, innerNClu, outerNClu));
0693     draw_text -> DrawLatex(0.21, 0.85, Form("NReco_tracklet: %i", evt_reco_track_gr_All->GetN()));
0694     coord_line -> DrawLine(-3.5, 0, 3.5, 0);
0695     coord_line -> DrawLine(-3.5, 360, 3.5, 360);
0696     c1 -> Print( Form("%s/evt_track_eID_%i.pdf", out_folder_directory_evt.c_str(), event_i) );
0697     c1 -> Clear();
0698 
0699     evt_reco_track_gr_PhiLoose -> GetXaxis() -> SetTitle("#eta");
0700     evt_reco_track_gr_PhiLoose -> GetYaxis() -> SetTitle("#phi");
0701     evt_reco_track_gr_PhiLoose -> GetXaxis() -> SetLimits(-3.5, 3.5);
0702     evt_reco_track_gr_PhiLoose -> GetYaxis() -> SetRangeUser(-10, 420);
0703     evt_reco_track_gr_PhiLoose -> GetXaxis() -> SetNdivisions(505);
0704     evt_reco_track_gr_PhiLoose -> Draw("ap");
0705     evt_true_track_gr -> Draw("p same");
0706     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
0707     draw_text -> DrawLatex(0.21, 0.90, Form("NTrueTrack: %i, innerNClu: %i, outerNClu: %i", NTrueTrack, innerNClu, outerNClu));
0708     draw_text -> DrawLatex(0.21, 0.85, Form("NReco_tracklet: %i", evt_reco_track_gr_PhiLoose->GetN()));
0709     coord_line -> DrawLine(-3.5, 0, 3.5, 0);
0710     coord_line -> DrawLine(-3.5, 360, 3.5, 360);
0711     c1 -> Print( Form("%s/evt_track_eID_%i.pdf", out_folder_directory_evt.c_str(), event_i) );
0712     c1 -> Clear();
0713 
0714     evt_reco_track_gr_Z -> GetXaxis() -> SetTitle("#eta");
0715     evt_reco_track_gr_Z -> GetYaxis() -> SetTitle("#phi");
0716     evt_reco_track_gr_Z -> GetXaxis() -> SetLimits(-3.5, 3.5);
0717     evt_reco_track_gr_Z -> GetYaxis() -> SetRangeUser(-10, 420);
0718     evt_reco_track_gr_Z -> GetXaxis() -> SetNdivisions(505);
0719     evt_reco_track_gr_Z -> Draw("ap");
0720     evt_true_track_gr -> Draw("p same");
0721     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
0722     draw_text -> DrawLatex(0.21, 0.90, Form("NTrueTrack: %i, innerNClu: %i, outerNClu: %i", NTrueTrack, innerNClu, outerNClu));
0723     draw_text -> DrawLatex(0.21, 0.85, Form("NReco_tracklet: %i", evt_reco_track_gr_Z->GetN()));
0724     coord_line -> DrawLine(-3.5, 0, 3.5, 0);
0725     coord_line -> DrawLine(-3.5, 360, 3.5, 360);
0726     c1 -> Print( Form("%s/evt_track_eID_%i.pdf", out_folder_directory_evt.c_str(), event_i) );
0727     c1 -> Clear();
0728 
0729     evt_reco_track_gr_ZDCA -> GetXaxis() -> SetTitle("#eta");
0730     evt_reco_track_gr_ZDCA -> GetYaxis() -> SetTitle("#phi");
0731     evt_reco_track_gr_ZDCA -> GetXaxis() -> SetLimits(-3.5, 3.5);
0732     evt_reco_track_gr_ZDCA -> GetYaxis() -> SetRangeUser(-10, 420);
0733     evt_reco_track_gr_ZDCA -> GetXaxis() -> SetNdivisions(505);
0734     evt_reco_track_gr_ZDCA -> Draw("ap");
0735     evt_true_track_gr -> Draw("p same");
0736     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
0737     draw_text -> DrawLatex(0.21, 0.90, Form("NTrueTrack: %i, innerNClu: %i, outerNClu: %i", NTrueTrack, innerNClu, outerNClu));
0738     draw_text -> DrawLatex(0.21, 0.85, Form("NReco_tracklet: %i", evt_reco_track_gr_ZDCA->GetN()));
0739     coord_line -> DrawLine(-3.5, 0, 3.5, 0);
0740     coord_line -> DrawLine(-3.5, 360, 3.5, 360);
0741     c1 -> Print( Form("%s/evt_track_eID_%i.pdf", out_folder_directory_evt.c_str(), event_i) );
0742     c1 -> Clear();
0743 
0744     evt_reco_track_gr_ZDCAPhi -> GetXaxis() -> SetTitle("#eta");
0745     evt_reco_track_gr_ZDCAPhi -> GetYaxis() -> SetTitle("#phi");
0746     evt_reco_track_gr_ZDCAPhi -> GetXaxis() -> SetLimits(-3.5, 3.5);
0747     evt_reco_track_gr_ZDCAPhi -> GetYaxis() -> SetRangeUser(-10, 420);
0748     evt_reco_track_gr_ZDCAPhi -> GetXaxis() -> SetNdivisions(505);
0749     evt_reco_track_gr_ZDCAPhi -> Draw("ap");
0750     evt_true_track_gr -> Draw("p same");
0751     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
0752     draw_text -> DrawLatex(0.21, 0.90, Form("NTrueTrack: %i, innerNClu: %i, outerNClu: %i", NTrueTrack, innerNClu, outerNClu));
0753     draw_text -> DrawLatex(0.21, 0.85, Form("NReco_tracklet: %i", evt_reco_track_gr_ZDCAPhi->GetN()));
0754     coord_line -> DrawLine(-3.5, 0, 3.5, 0);
0755     coord_line -> DrawLine(-3.5, 360, 3.5, 360);
0756     c1 -> Print( Form("%s/evt_track_eID_%i.pdf)", out_folder_directory_evt.c_str(), event_i) );
0757     c1 -> Clear();
0758 }
0759 
0760 // // note : this function is for the event by event vertex calculation
0761 // // note : this function is the old method, which means there are two for loops that checks all the combinations, it takes a lot of time
0762 // void INTTEta::ProcessEvt(int event_i, vector<clu_info> temp_sPH_inner_nocolumn_vec, vector<clu_info> temp_sPH_outer_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_rz_vec, int NvtxMC, vector<double> TrigvtxMC, bool PhiCheckTag, Long64_t bco_full, pair<double,double> evt_z, int centrality_bin, vector<vector<float>> true_track_info) // note : evt_z : {z, width} 
0763 // {   
0764 //     return_tag = 0;
0765 
0766 //     if (event_i%1 == 0) {cout<<"In INTTEta class, running event : "<<event_i<<endl;}
0767 
0768 //     inner_NClu = temp_sPH_inner_nocolumn_vec.size();
0769 //     outer_NClu = temp_sPH_outer_nocolumn_vec.size();
0770 //     total_NClus = inner_NClu + outer_NClu;
0771 
0772 //     // cout<<"test_0"<<endl;
0773 //     if (total_NClus < zvtx_cal_require) {return; cout<<"return confirmation"<<endl;}   
0774     
0775 //     if (run_type == "MC" && NvtxMC != 1) { return; cout<<"In INTTEta class, event : "<<event_i<<" Nvtx : "<<NvtxMC<<" Nvtx more than one "<<endl;}
0776 //     if (PhiCheckTag == false)            { return; cout<<"In INTTEta class, event : "<<event_i<<" Nvtx : "<<NvtxMC<<" Not full phi has hits "<<endl;}
0777     
0778 //     if (inner_NClu < 10 || outer_NClu < 10 || total_NClus > N_clu_cut || total_NClus < N_clu_cutl)
0779 //     {
0780 //         return;
0781 //         printf("In INTTEta class, event : %i, low clu continue, NClus : %lu \n", event_i, total_NClus); 
0782 //     }
0783 
0784 //     // todo : the z vertex range is here
0785 //     if (-220 > evt_z.first + evt_z.second || -180 < evt_z.first - evt_z.second) {return;}
0786     
0787     
0788 //     N_GoodEvent += 1;
0789 //     N_GoodEvent_vec[centrality_map[centrality_bin]] += 1;
0790 
0791 //     // cout<<"N inner cluster : "<<inner_NClu<<" N outer cluster : "<<outer_NClu<<endl;
0792 
0793 //     if (run_type == "MC")
0794 //     {
0795 //         // note : for the true track case ----------------------------------------------------------------------------------------------------------------------------------------------------------------
0796 //         double INTT_eta_acceptance_l = -0.5 * TMath::Log((sqrt(pow(-230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))-(-230.-TrigvtxMC[2]*10.)) / (sqrt(pow(-230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))+(-230.-TrigvtxMC[2]*10.))); // note : left
0797 //         double INTT_eta_acceptance_r =  -0.5 * TMath::Log((sqrt(pow(230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))-(230.-TrigvtxMC[2]*10.)) / (sqrt(pow(230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))+(230.-TrigvtxMC[2]*10.))); // note : right
0798 //         // if (event_i % 100 == 0){cout<<"z : "<<TrigvtxMC[2]*10.<<" eta : "<<INTT_eta_acceptance_l<<" "<<INTT_eta_acceptance_r<<endl;}
0799 
0800 //         // cout<<"true_track_info : "<<true_track_info.size()<<endl;    
0801 //         for (int track_i = 0; track_i < true_track_info.size(); track_i++)
0802 //         {
0803 //             if (true_track_info[track_i][2] == 111 || true_track_info[track_i][2] == 22 || abs(true_track_info[track_i][2]) == 2112){continue;}
0804 
0805 //             if (true_track_info[track_i][0] > INTT_eta_acceptance_l && true_track_info[track_i][0] < INTT_eta_acceptance_r)
0806 //             {
0807 //                 dNdeta_1D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0]);
0808 //                 dNdeta_1D_MC[dNdeta_1D_MC.size() - 1]        -> Fill(true_track_info[track_i][0]);   
0809 //                 final_dNdeta_1D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0]);
0810 //                 final_dNdeta_1D_MC[dNdeta_1D_MC.size() - 1]        -> Fill(true_track_info[track_i][0]);
0811 //                 track_eta_z_2D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);
0812 //                 track_eta_z_2D_MC[track_eta_z_2D_MC.size() - 1]   -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);    
0813 
0814 //                 // cout<<"true track eta : "<<true_track_info[track_i][0]<<" phi : "<<convertTo360(true_track_info[track_i][1])<<endl;
0815 //                 // cout<<"("<<true_track_info[track_i][0]<<", "<<convertTo360(true_track_info[track_i][1])<<"), ";
0816 
0817 //                 evt_true_track_gr -> SetPoint(evt_true_track_gr->GetN(),true_track_info[track_i][0], convertTo360(true_track_info[track_i][1]));
0818 
0819 //                 evt_NTrack_MC += 1;
0820 //             }
0821 //         }
0822 //         // if (evt_NTrack_MC < 10) {cout<<"evt : "<<event_i<<" ---- N reco track : "<<evt_NTrack<<" N true track : "<<evt_NTrack_MC<<" ratio : "<<double(evt_NTrack) / double(evt_NTrack_MC)<<endl;}
0823 //     }
0824 
0825 
0826 //     // cout<<"test_1"<<endl;
0827 //     for ( int inner_i = 0; inner_i < temp_sPH_inner_nocolumn_vec.size(); inner_i++ )
0828 //     {    
0829 //         loop_NGoodPair = 0;
0830         
0831 //         for ( int outer_i = 0; outer_i < temp_sPH_outer_nocolumn_vec.size(); outer_i++ )
0832 //         {
0833 //             // cout<<event_i<<" test_5 "<<inner_i<<" "<<outer_i<<endl;
0834 //             // note : calculate the cluster phi after the vertex correction which can enhence the purity of the tracklet selection
0835 //             Clus_InnerPhi_Offset = (temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second < 0) ? atan2(temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second, temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second, temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first) * (180./TMath::Pi());
0836 //             Clus_OuterPhi_Offset = (temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second < 0) ? atan2(temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second, temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second, temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first) * (180./TMath::Pi());
0837 //             double delta_phi = Clus_InnerPhi_Offset - Clus_OuterPhi_Offset;
0838 //             double track_phi = (Clus_InnerPhi_Offset + Clus_OuterPhi_Offset)/2.;
0839 //             double inner_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{temp_sPH_inner_nocolumn_vec[inner_i].x, temp_sPH_inner_nocolumn_vec[inner_i].y, temp_sPH_inner_nocolumn_vec[inner_i].z});
0840 //             double outer_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{temp_sPH_outer_nocolumn_vec[outer_i].x, temp_sPH_outer_nocolumn_vec[outer_i].y, temp_sPH_outer_nocolumn_vec[outer_i].z});
0841 //             double delta_eta = inner_clu_eta - outer_clu_eta;
0842             
0843 //             // cout<<"test_2"<<endl;
0844 //             // note : before calculating the possible z vertex range of one tracklet, the vertex correction was applied
0845 //             pair<double,double> z_range_info = Get_possible_zvtx( 
0846 //                 0., // get_radius(beam_origin.first,beam_origin.second), 
0847 //                 {get_radius(temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first, temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second), temp_sPH_inner_nocolumn_vec[inner_i].z}, // note : unsign radius
0848 //                 {get_radius(temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first, temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second), temp_sPH_outer_nocolumn_vec[outer_i].z}  // note : unsign radius
0849 //             );
0850 
0851 //             if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0)
0852 //             {
0853 //                 Get_eta_pair = Get_eta(
0854 //                     {get_radius(beam_origin.first,beam_origin.second), evt_z.first,evt_z.second},
0855 //                     {get_radius(temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first, temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second), temp_sPH_inner_nocolumn_vec[inner_i].z},
0856 //                     {get_radius(temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first, temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second), temp_sPH_outer_nocolumn_vec[outer_i].z}
0857 //                 );
0858 
0859 //                 evt_reco_track_gr_All -> SetPoint(evt_reco_track_gr_All->GetN(),Get_eta_pair.second, track_phi);
0860 //             }
0861 
0862             
0863 //             // if ( Get_eta_pair.second > 1.4 && Get_eta_pair.second < 1.7 && track_phi > 50 && track_phi < 60 ) {
0864 //             //     cout<<" "<<endl;
0865 //             //     cout<<"reco eta : "<<Get_eta_pair.second<<" reco phi : "<<track_phi<<" delta eta : "<<delta_eta<<endl;
0866 //             //     cout<<"all pair info, inner clu pos "<<temp_sPH_inner_nocolumn_vec[inner_i].x<<" "<<temp_sPH_inner_nocolumn_vec[inner_i].y<<" "<<temp_sPH_inner_nocolumn_vec[inner_i].z<<" phi : "<<Clus_InnerPhi_Offset<<endl;
0867 //             //     cout<<"all pair info, outer clu pos "<<temp_sPH_outer_nocolumn_vec[outer_i].x<<" "<<temp_sPH_outer_nocolumn_vec[outer_i].y<<" "<<temp_sPH_outer_nocolumn_vec[outer_i].z<<" phi : "<<Clus_OuterPhi_Offset<<endl;
0868 //             //     cout<<"z vertex range : "<<z_range_info.first - z_range_info.second<<" "<<z_range_info.first + z_range_info.second<<endl;
0869 //             //     cout<<"accept z range : "<<evt_z.first - evt_z.second<<" "<<evt_z.first + evt_z.second<<endl;
0870                 
0871 //             // }
0872 
0873 //             if (fabs(delta_phi) > 5.72) {continue;}
0874 //             if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0) {evt_reco_track_gr_PhiLoose -> SetPoint(evt_reco_track_gr_PhiLoose->GetN(),Get_eta_pair.second, track_phi);}
0875 
0876 //             track_delta_eta_1D[centrality_map[centrality_bin]] -> Fill( delta_eta );
0877 //             track_delta_eta_1D[track_delta_eta_1D.size() - 1]  -> Fill( delta_eta );
0878 
0879 //             track_DeltaPhi_DeltaEta_2D[centrality_map[centrality_bin]]        -> Fill(delta_phi, delta_eta);
0880 //             track_DeltaPhi_DeltaEta_2D[track_DeltaPhi_DeltaEta_2D.size() - 1] -> Fill(delta_phi, delta_eta);
0881 
0882 //             // cout<<event_i<<" test_6 "<<inner_i<<" "<<outer_i<<endl;
0883 //             // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
0884 //             if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
0885 //             // cout<<"range test: "<<z_range_info.first - z_range_info.second<<" "<<z_range_info.first + z_range_info.second<<" vertex: "<<evt_z.first<<" "<<evt_z.second<<endl;
0886 //             // cout<<"test_3"<<endl;
0887 
0888 //             if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0) {evt_reco_track_gr_Z -> SetPoint(evt_reco_track_gr_Z->GetN(),Get_eta_pair.second, track_phi);}
0889             
0890 //             // note : the reason to use the DCA calculation with sign is because that the distribution of 1D DCA will be single peak only
0891 //             double DCA_sign = calculateAngleBetweenVectors(
0892 //                 temp_sPH_outer_nocolumn_vec[outer_i].x, temp_sPH_outer_nocolumn_vec[outer_i].y,
0893 //                 temp_sPH_inner_nocolumn_vec[inner_i].x, temp_sPH_inner_nocolumn_vec[inner_i].y,
0894 //                 beam_origin.first, beam_origin.second
0895 //             );
0896 
0897 //             // vector<double> DCA_info_vec = calculateDistanceAndClosestPoint(
0898 //             //     temp_sPH_inner_nocolumn_vec[inner_i].x, temp_sPH_inner_nocolumn_vec[inner_i].y,
0899 //             //     temp_sPH_outer_nocolumn_vec[outer_i].x, temp_sPH_outer_nocolumn_vec[outer_i].y,
0900 //             //     beam_origin.first, beam_origin.second
0901 //             // );
0902 //             // if (DCA_info_vec[0] != fabs(DCA_sign) && fabs( DCA_info_vec[0] - fabs(DCA_sign) ) > 0.1 ){
0903 //             //     cout<<"different DCA : "<<DCA_info_vec[0]<<" "<<DCA_sign<<" diff : "<<DCA_info_vec[0] - fabs(DCA_sign)<<endl;
0904 //             // }
0905 
0906 //             track_delta_eta_1D_post[centrality_map[centrality_bin]]     -> Fill( delta_eta );
0907 //             track_delta_eta_1D_post[track_delta_eta_1D_post.size() - 1] -> Fill( delta_eta );
0908 
0909 //             track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( delta_phi );
0910 //             track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( delta_phi );
0911             
0912 //             track_DCA_distance[centrality_map[centrality_bin]] -> Fill( DCA_sign );
0913 //             track_DCA_distance[track_DCA_distance.size() - 1]  -> Fill( DCA_sign ); 
0914 
0915 //             track_phi_DCA_2D[centrality_map[centrality_bin]] -> Fill( delta_phi, DCA_sign );
0916 //             track_phi_DCA_2D[track_phi_DCA_2D.size() - 1]    -> Fill( delta_phi, DCA_sign );
0917 
0918 //             // cout<<" "<<endl;
0919 //             // cout<<"inner_i : "<<inner_i<<" outer_i "<<outer_i<<" true z : "<<TrigvtxMC[2]*10.<<" reco z: "<<evt_z.first<<endl;
0920 //             // cout<<"all pair info, inner clu pos "<<temp_sPH_inner_nocolumn_vec[inner_i].x<<" "<<temp_sPH_inner_nocolumn_vec[inner_i].y<<" "<<temp_sPH_inner_nocolumn_vec[inner_i].z<<" phi : "<<Clus_InnerPhi_Offset<<endl;
0921 //             // cout<<"all pair info, outer clu pos "<<temp_sPH_outer_nocolumn_vec[outer_i].x<<" "<<temp_sPH_outer_nocolumn_vec[outer_i].y<<" "<<temp_sPH_outer_nocolumn_vec[outer_i].z<<" phi : "<<Clus_OuterPhi_Offset<<endl;
0922 //             // if (fabs(delta_phi) < 4) {cout<<"("<<Get_eta_pair.second<<", "<<track_phi<<"), ";}
0923 
0924 //             // if (DCA_cut.first < DCA_sign && DCA_sign < DCA_cut.second)
0925 //             if (true)
0926 //             {
0927 //                 if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0) {evt_reco_track_gr_ZDCA -> SetPoint(evt_reco_track_gr_ZDCA->GetN(),Get_eta_pair.second, track_phi);}
0928 
0929 //                 if (fabs(delta_phi) < phi_diff_cut)
0930 //                 {
0931 //                     if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0) {evt_reco_track_gr_ZDCAPhi -> SetPoint(evt_reco_track_gr_ZDCAPhi->GetN(),Get_eta_pair.second, track_phi);}    
0932 //                     // cout<<"reco eta : "<<Get_eta_pair.second<<" reco phi : "<<track_phi<<endl;
0933 
0934 //                     // if (fabs(Get_eta_pair.second) < 0.1) { cout<<"eta "<<Get_eta_pair.second<<", three points : "<<get_radius(beam_origin.first,beam_origin.second)<<" "<<evt_z.first<<" "<<evt_z.second<<" "<<
0935 //                     // get_radius(temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first, temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second)<<" "<<temp_sPH_inner_nocolumn_vec[inner_i].z<<" "<<
0936 //                     // get_radius(temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first, temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second)<<" "<<temp_sPH_outer_nocolumn_vec[outer_i].z<<endl;}
0937 
0938 //                     Get_eta_pair = Get_eta(
0939 //                         {get_radius(beam_origin.first,beam_origin.second), evt_z.first,evt_z.second},
0940 //                         {get_radius(temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first, temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second), temp_sPH_inner_nocolumn_vec[inner_i].z},
0941 //                         {get_radius(temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first, temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second), temp_sPH_outer_nocolumn_vec[outer_i].z}
0942 //                     );
0943 
0944 //                     double eta_bin = eta_region_hist -> Fill(Get_eta_pair.second);
0945 //                     // cout<<"test1 "<<eta_bin<<endl;
0946 //                     if (eta_bin != -1)
0947 //                     {
0948 //                         final_track_delta_phi_1D[centrality_map[centrality_bin]][eta_bin - 1]      -> Fill(delta_phi);
0949 //                         final_track_delta_phi_1D[final_track_delta_phi_1D.size() - 1][eta_bin - 1] -> Fill(delta_phi);
0950 //                         out_track_delta_phi_d.push_back(delta_phi);
0951 //                         out_track_eta_d.push_back(Get_eta_pair.second);
0952 //                         out_track_eta_i.push_back(eta_bin);
0953 //                     }
0954                     
0955 
0956 //                     reco_eta_correlation_2D -> Fill(Get_eta_pair.second, (inner_clu_eta + outer_clu_eta)/2.);
0957 //                     reco_eta_diff_reco3P_2D -> Fill(Get_eta_pair.second, Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
0958 //                     reco_eta_diff_1D        -> Fill(Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
0959 
0960 //                     track_DeltaPhi_eta_2D[centrality_map[centrality_bin]]   -> Fill(delta_phi, Get_eta_pair.second);
0961 //                     track_DeltaPhi_eta_2D[track_DeltaPhi_eta_2D.size() - 1] -> Fill(delta_phi, Get_eta_pair.second);
0962 
0963 //                     // cout<<"test_5"<<endl;
0964 //                     dNdeta_1D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second);
0965 //                     dNdeta_1D[dNdeta_1D.size() - 1]           -> Fill(Get_eta_pair.second);
0966 
0967 //                     track_eta_phi_2D[centrality_map[centrality_bin]] -> Fill(track_phi, Get_eta_pair.second);
0968 //                     track_eta_phi_2D[track_eta_phi_2D.size() - 1]    -> Fill(track_phi, Get_eta_pair.second);
0969                     
0970 //                     track_eta_z_2D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second, evt_z.first);
0971 //                     track_eta_z_2D[track_eta_z_2D.size() - 1]      -> Fill(Get_eta_pair.second, evt_z.first);
0972             
0973 //                     evt_NTrack += 1;
0974 //                     // cout<<event_i<<" test_10 "<<inner_i<<" "<<outer_i<<endl;
0975 //                 }
0976 
0977 //             }
0978             
0979 //         }
0980 //     }
0981 
0982 //     // note : prepare the tree out
0983 //     out_eID = event_i;
0984 //     out_evt_centrality_bin = centrality_bin;
0985 //     out_evt_zvtx = evt_z.first;
0986 //     tree_out -> Fill();
0987 
0988 //     // cout<<" "<<endl;
0989 //     // cout<<" "<<endl;
0990 //     // cout<<"test_8"<<endl;
0991 //     if (run_type == "MC")
0992 //     {
0993 //         track_correlation_2D -> Fill(evt_NTrack_MC, evt_NTrack);
0994 //         track_ratio_1D[centrality_map[centrality_bin]] -> Fill( double(evt_NTrack) / double(evt_NTrack_MC) );
0995 //         track_ratio_1D[track_ratio_1D.size() - 1]      -> Fill( double(evt_NTrack) / double(evt_NTrack_MC) );
0996 //     }
0997         
0998 //     track_cluster_ratio_multiplicity_2D -> Fill( total_NClus, double(total_NClus) / double(evt_NTrack) );
0999 //     track_cluster_ratio_1D[centrality_map[centrality_bin]]    -> Fill( double(total_NClus) / double(evt_NTrack) );
1000 //     track_cluster_ratio_1D[track_cluster_ratio_1D.size() - 1] -> Fill( double(total_NClus) / double(evt_NTrack) );
1001 
1002 //     if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0){print_evt_plot(event_i, evt_NTrack_MC, inner_NClu, outer_NClu);}
1003 
1004 //     return_tag = 1;
1005 // }
1006 
1007 // note : this function is for the event by event vertex calculation
1008 // note : this function is the new method, which means that we first put the cluster into a phi map, and then there are two for loops still, but we only check the certain range of the phi 
1009 // note : this function requires that one cluster can only be used once for single tracklet
1010 // note : so maybe there should be no background subtraction for this case
1011 void INTTEta::ProcessEvt(int event_i, vector<clu_info> temp_sPH_inner_nocolumn_vec, vector<clu_info> temp_sPH_outer_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_rz_vec, int NvtxMC, vector<double> TrigvtxMC, bool PhiCheckTag, Long64_t bco_full, pair<double,double> evt_z, int centrality_bin, vector<vector<float>> true_track_info){ // note : evt_z : {z, width}
1012     return_tag = 0;
1013 
1014     if (event_i%1 == 0) {cout<<"In INTTEta class, running event : "<<event_i<<endl;}
1015 
1016     inner_NClu = temp_sPH_inner_nocolumn_vec.size();
1017     outer_NClu = temp_sPH_outer_nocolumn_vec.size();
1018     total_NClus = inner_NClu + outer_NClu;
1019 
1020     // cout<<"test_0"<<endl;
1021     if (total_NClus < zvtx_cal_require) {return; cout<<"return confirmation"<<endl;}   
1022     
1023     if (run_type == "MC" && NvtxMC != 1) { return; cout<<"In INTTEta class, event : "<<event_i<<" Nvtx : "<<NvtxMC<<" Nvtx more than one "<<endl;}
1024     if (PhiCheckTag == false)            { return; cout<<"In INTTEta class, event : "<<event_i<<" Nvtx : "<<NvtxMC<<" Not full phi has hits "<<endl;}
1025     
1026     if (inner_NClu < 10 || outer_NClu < 10 || total_NClus > N_clu_cut || total_NClus < N_clu_cutl)
1027     {
1028         return;
1029         printf("In INTTEta class, event : %i, low clu continue, NClus : %lu \n", event_i, total_NClus); 
1030     }
1031 
1032     cout<<"test_1"<<endl;
1033     // todo : the z vertex range is here
1034     int reco_eta_z_bin = GetTH2BinXY(eta_z_region_hist_2D_map, eta_z_region_hist_2D_map -> Fill(0., evt_z.first)).second;
1035     if (reco_eta_z_bin == -1) {return;}
1036     // if (-220 > evt_z.first + evt_z.second || -180 < evt_z.first - evt_z.second) {return;}
1037     // if (-100 > evt_z.first + evt_z.second || 100 < evt_z.first - evt_z.second) {return;}
1038     
1039     
1040     MBin_Z_hist_2D -> Fill(centrality_map[centrality_bin], evt_z.first);
1041     MBin_Z_hist_2D -> Fill(centrality_region.size() - 1,   evt_z.first);
1042     
1043     N_GoodEvent += 1;
1044     N_GoodEvent_vec[centrality_map[centrality_bin]] += 1;
1045 
1046     // cout<<"N inner cluster : "<<inner_NClu<<" N outer cluster : "<<outer_NClu<<endl;
1047 
1048     double INTT_eta_acceptance_l = -0.5 * TMath::Log((sqrt(pow(-230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))-(-230.-TrigvtxMC[2]*10.)) / (sqrt(pow(-230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))+(-230.-TrigvtxMC[2]*10.))); // note : left
1049     double INTT_eta_acceptance_r =  -0.5 * TMath::Log((sqrt(pow(230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))-(230.-TrigvtxMC[2]*10.)) / (sqrt(pow(230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))+(230.-TrigvtxMC[2]*10.))); // note : right
1050 
1051     cout<<"test_2"<<endl;
1052 
1053     if (run_type == "MC")
1054     {
1055         // note : for the true track case ----------------------------------------------------------------------------------------------------------------------------------------------------------------
1056         // if (event_i % 100 == 0){cout<<"z : "<<TrigvtxMC[2]*10.<<" eta : "<<INTT_eta_acceptance_l<<" "<<INTT_eta_acceptance_r<<endl;}
1057 
1058         // cout<<"true_track_info : "<<true_track_info.size()<<endl;    
1059         for (int track_i = 0; track_i < true_track_info.size(); track_i++)
1060         {
1061             if (true_track_info[track_i][2] == 111 || true_track_info[track_i][2] == 22 || abs(true_track_info[track_i][2]) == 2112){continue;}
1062 
1063             if (true_track_info[track_i][0] > INTT_eta_acceptance_l && true_track_info[track_i][0] < INTT_eta_acceptance_r)
1064             {
1065                 // note : 1D, fine binning for a detailed check 
1066                 dNdeta_1D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0]);
1067                 dNdeta_1D_MC[dNdeta_1D_MC.size() - 1]        -> Fill(true_track_info[track_i][0]);   
1068 
1069                 if (GetTH2BinXY(eta_z_region_hist_2D_map, eta_z_region_hist_2D_map -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.)).second == tight_zvtx_bin)
1070                 {
1071                     // note : 1D, coarse binning for the final dNdeta result with a fixed z vertex range
1072                     final_dNdeta_1D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0]);
1073                     final_dNdeta_1D_MC[final_dNdeta_1D_MC.size() - 1]  -> Fill(true_track_info[track_i][0]);
1074                 }                
1075 
1076                 // note : 2D, fine binning for the detailed check of eta and z distribution 
1077                 track_eta_z_2D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);
1078                 track_eta_z_2D_MC[track_eta_z_2D_MC.size() - 1]   -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);    
1079 
1080                 // note : coarse eta and z binning, this is for the final dNdeta result
1081                 eta_z_region_hist_2D_MC[centrality_map[centrality_bin]]     -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);
1082                 eta_z_region_hist_2D_MC[eta_z_region_hist_2D_MC.size() - 1] -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);
1083 
1084                 // cout<<"true track eta : "<<true_track_info[track_i][0]<<" phi : "<<convertTo360(true_track_info[track_i][1])<<endl;
1085                 // cout<<"("<<true_track_info[track_i][0]<<", "<<convertTo360(true_track_info[track_i][1])<<"), ";
1086 
1087                 evt_true_track_gr -> SetPoint(evt_true_track_gr->GetN(),true_track_info[track_i][0], convertTo360(true_track_info[track_i][1]));
1088 
1089                 evt_NTrack_MC += 1;
1090             }
1091         }
1092         // if (evt_NTrack_MC < 10) {cout<<"evt : "<<event_i<<" ---- N reco track : "<<evt_NTrack<<" N true track : "<<evt_NTrack_MC<<" ratio : "<<double(evt_NTrack) / double(evt_NTrack_MC)<<endl;}
1093     }
1094 
1095     cout<<"test_3"<<endl;
1096 
1097     // note : put the cluster into the phi map, the first bool is for the cluster usage.
1098     // note : false means the cluster is not used
1099     for (int inner_i = 0; inner_i < temp_sPH_inner_nocolumn_vec.size(); inner_i++) {
1100         Clus_InnerPhi_Offset = (temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second < 0) ? atan2(temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second, temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second, temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first) * (180./TMath::Pi());
1101         inner_clu_phi_map[ int(Clus_InnerPhi_Offset) ].push_back({false,temp_sPH_inner_nocolumn_vec[inner_i]});
1102 
1103         double clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{temp_sPH_inner_nocolumn_vec[inner_i].x, temp_sPH_inner_nocolumn_vec[inner_i].y, temp_sPH_inner_nocolumn_vec[inner_i].z});
1104         if (clu_eta > INTT_eta_acceptance_l && clu_eta < INTT_eta_acceptance_r) {effective_total_NClus += 1;}
1105     }
1106     for (int outer_i = 0; outer_i < temp_sPH_outer_nocolumn_vec.size(); outer_i++) {
1107         Clus_OuterPhi_Offset = (temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second < 0) ? atan2(temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second, temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second, temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first) * (180./TMath::Pi());
1108         outer_clu_phi_map[ int(Clus_OuterPhi_Offset) ].push_back({false,temp_sPH_outer_nocolumn_vec[outer_i]});
1109 
1110         double clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{temp_sPH_outer_nocolumn_vec[outer_i].x, temp_sPH_outer_nocolumn_vec[outer_i].y, temp_sPH_outer_nocolumn_vec[outer_i].z});
1111         if (clu_eta > INTT_eta_acceptance_l && clu_eta < INTT_eta_acceptance_r) {effective_total_NClus += 1;}
1112     }
1113 
1114     // // note : find the Mega cluster preparation for inner barrel 
1115     // for (int inner_phi_i = 0; inner_phi_i < 360; inner_phi_i++)
1116     // {
1117     //     for (int inner_phi_clu_i = 0; inner_phi_clu_i < inner_clu_phi_map[inner_phi_i].size(); inner_phi_clu_i++)
1118     //     {
1119     //         // note : if the cluster is used, then skip
1120     //         if (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].first == true) {continue;}
1121 
1122     //         Clus_InnerPhi_Offset_1 = (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1123 
1124     //         // note : the scan range of the -1, 0, 1
1125     //         for (int scan_i = -1; scan_i < 2; scan_i++)
1126     //         {
1127     //             int true_scan_i = ((inner_phi_i + scan_i) < 0) ? 360 + (inner_phi_i + scan_i) : ((inner_phi_i + scan_i) > 359) ? (inner_phi_i + scan_i)-360 : inner_phi_i + scan_i;
1128     //             for (int inner_scan_clu_i = 0; inner_scan_clu_i < inner_clu_phi_map[true_scan_i].size(); inner_scan_clu_i++)
1129     //             {
1130     //                 // note : if the cluster is used, then skip
1131     //                 if (inner_clu_phi_map[true_scan_i][inner_scan_clu_i].first == true) {continue;}
1132 
1133     //                 // note : the cluster itself
1134     //                 if (true_scan_i == inner_phi_i && inner_phi_clu_i == inner_scan_clu_i) {continue;}
1135                     
1136     //                 // note : if it has the same sub layer ID, then skip
1137     //                 // todo : this cut may only work for the MC, for the data, it requires additional check
1138     //                 if (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.layer == inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.layer) {continue;}
1139 
1140     //                 // note : I expect the two cluster have to have the same z position
1141     //                 // note : but in case of data, the z position of the same strip may be fluctuated a little bit 
1142     //                 // todo : currently, set the Z position flutuation to be 4 mm
1143     //                 if (fabs(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z - inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.z) > 4 ) {continue;}
1144 
1145     //                 Clus_InnerPhi_Offset_2 = (inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1146 
1147     //                 double delta_phi = get_delta_phi(Clus_InnerPhi_Offset_1, Clus_InnerPhi_Offset_2);
1148 
1149     //                 // note : if the two cluster are too far away in phi angle, the skip
1150     //                 // todo : the delta phi cut may need to be adjusted
1151     //                 if (fabs( delta_phi ) > 0.6) {continue;}
1152 
1153     //                 // note : the pair that passed the cut mentioned above can be considered as a proto_mega_cluster
1154     //                 Mega_inner_clu_pair_index.push_back({{inner_phi_i, inner_phi_clu_i, true_scan_i, inner_scan_clu_i}});
1155     //                 Mega_inner_clu_delta_phi_abs.push_back(fabs(delta_phi));
1156     //                 Mega_inner_clu_phi.push_back( get_track_phi(Clus_InnerPhi_Offset_1, delta_phi) );
1157     //             }
1158     //         }
1159     //     }
1160     // }
1161 
1162     // // note : finr the Mega cluste preparation for outer barrel 
1163     // for (int outer_phi_i = 0; outer_phi_i < 360; outer_phi_i++)
1164     // {
1165     //     for (int outer_phi_clu_i = 0; outer_phi_clu_i < outer_clu_phi_map[outer_phi_i].size(); outer_phi_clu_i++)
1166     //     {
1167     //         // note : if the cluster is used, then skip
1168     //         if (outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].first == true) {continue;}
1169 
1170     //         Clus_OuterPhi_Offset_1 = (outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1171 
1172     //         // note : the scan range of the -1, 0, 1
1173     //         for (int scan_i = -1; scan_i < 2; scan_i++)
1174     //         {
1175     //             int true_scan_i = ((outer_phi_i + scan_i) < 0) ? 360 + (outer_phi_i + scan_i) : ((outer_phi_i + scan_i) > 359) ? (outer_phi_i + scan_i)-360 : outer_phi_i + scan_i;
1176     //             for (int outer_scan_clu_i = 0; outer_scan_clu_i < outer_clu_phi_map[true_scan_i].size(); outer_scan_clu_i++)
1177     //             {
1178     //                 // note : if the cluster is used, then skip
1179     //                 if (outer_clu_phi_map[true_scan_i][outer_scan_clu_i].first == true) {continue;}
1180 
1181     //                 // note : the cluster itself
1182     //                 if (true_scan_i == outer_phi_i && outer_phi_clu_i == outer_scan_clu_i) {continue;}
1183                     
1184     //                 // note : if it has the same sub layer ID, then skip
1185     //                 // todo : this cut may only work for the MC, for the data, it requires additional check
1186     //                 if (outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.layer == outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.layer) {continue;}
1187 
1188     //                 // note : I expect the two cluster have to have the same z position
1189     //                 // note : but in case of data, the z position of the same strip may be fluctuated a little bit 
1190     //                 // todo : currently, set the Z position flutuation to be 4 mm
1191     //                 if (fabs(outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.z - outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.z) > 4 ) {continue;}
1192 
1193     //                 Clus_OuterPhi_Offset_2 = (outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1194 
1195     //                 double delta_phi = get_delta_phi(Clus_OuterPhi_Offset_1, Clus_OuterPhi_Offset_2);
1196 
1197     //                 // note : if the two cluster are too far away in phi angle, the skip
1198     //                 // todo : the delta phi cut may need to be adjusted
1199     //                 if (fabs(delta_phi) > 0.6) {continue;}
1200 
1201     //                 // note : the pair that passed the cut mentioned above can be considered as a proto_mega_cluster
1202     //                 Mega_outer_clu_pair_index.push_back({{outer_phi_i, outer_phi_clu_i, true_scan_i, outer_scan_clu_i}});
1203     //                 Mega_outer_clu_delta_phi_abs.push_back(fabs(delta_phi));
1204     //                 Mega_outer_clu_phi.push_back( get_track_phi(Clus_OuterPhi_Offset_1, delta_phi) );
1205     //             }
1206     //         }
1207     //     }
1208     // }
1209 
1210     // // note : try to sort the pair of the Inner Mega cluster by the abs delta phi
1211     // long long inner_mega_vec_size = Mega_inner_clu_delta_phi_abs.size();
1212     // long long ind_inner_mega[Mega_inner_clu_delta_phi_abs.size()];
1213     // TMath::Sort(inner_mega_vec_size, &Mega_inner_clu_delta_phi_abs[0], ind_inner_mega, false);
1214 
1215     // // note : try to sort the pair of the Outer Mega cluster by the abs delta phi
1216     // long long outer_mega_vec_size = Mega_outer_clu_delta_phi_abs.size();
1217     // long long ind_outer_mega[Mega_outer_clu_delta_phi_abs.size()];
1218     // TMath::Sort(outer_mega_vec_size, &Mega_outer_clu_delta_phi_abs[0], ind_outer_mega, false);
1219 
1220     // // note : 4 cluster track, Inner mega - Outer mega
1221     // for (int inner_i; inner_i < Mega_inner_clu_pair_index.size(); inner_i++)
1222     // {
1223     //     int id_inner[4] = {
1224     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][0], 
1225     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][1], // note : one inner cluster
1226     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][2], 
1227     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][3] // note : another inner cluster
1228     //     };
1229 
1230     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] != 0) {continue;}
1231     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] != 0) {continue;}
1232 
1233     //     for (int outer_i; outer_i < Mega_outer_clu_pair_index.size(); outer_i++)
1234     //     {
1235     //         int id_outer[4] = {
1236     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][0], 
1237     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][1], //  note : one outer cluster 
1238     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][2], 
1239     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][3] // note : abother outer cluster
1240     //         };
1241             
1242     //         if (outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] != 0) {continue;}
1243     //         if (outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] != 0) {continue;}
1244 
1245     //         // note : the delta phi cut
1246     //         // todo : the delta phi cut value is fixed here
1247     //         if (fabs(get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Mega_outer_clu_phi[ind_outer_mega[outer_i]])) > 0.6) {continue;}
1248             
1249     //         int id_inner_small_r = ( get_radius(inner_clu_phi_map[id_inner[0]][id_inner[1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[0]][id_inner[1]].second.y - beam_origin.second) < get_radius(inner_clu_phi_map[id_inner[2]][id_inner[3]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[2]][id_inner[3]].second.y - beam_origin.second) ) ? 0 : 2;
1250     //         int id_outer_big_r   = ( get_radius(outer_clu_phi_map[id_outer[0]][id_outer[1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[0]][id_outer[1]].second.y - beam_origin.second) > get_radius(outer_clu_phi_map[id_outer[2]][id_outer[3]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[2]][id_outer[3]].second.y - beam_origin.second) ) ? 0 : 2;
1251 
1252     //         pair<double,double> z_range_info = Get_possible_zvtx( 
1253     //             0., // get_radius(beam_origin.first,beam_origin.second), 
1254     //             {get_radius(inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.y - beam_origin.second), inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.z}, // note : unsign radius
1255     //             {get_radius(outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.y - beam_origin.second), outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.z}  // note : unsign radius
1256     //         );
1257 
1258     //         // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
1259     //         if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
1260 
1261     //         cluster4_track_phi_1D -> Fill(get_track_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Mega_outer_clu_phi[ind_outer_mega[outer_i]])));
1262 
1263     //         NClu4_track_count += 1;
1264 
1265     //         // note : to mark the cluster as used 
1266     //         inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] += 1;
1267     //         inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] += 1;
1268     //         outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] += 1;
1269     //         outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] += 1;
1270 
1271     //         inner_clu_phi_map[id_inner[0]][id_inner[1]].first = true;
1272     //         inner_clu_phi_map[id_inner[2]][id_inner[3]].first = true;
1273     //         outer_clu_phi_map[id_outer[0]][id_outer[1]].first = true;
1274     //         outer_clu_phi_map[id_outer[2]][id_outer[3]].first = true;
1275     //     }
1276     // }
1277 
1278     // // note : 3 cluster track, Inner mega - Outer normal
1279     // for (int inner_i; inner_i < Mega_inner_clu_pair_index.size(); inner_i++) // note : the inner mega cluster loop
1280     // {
1281     //     int id_inner[4] = {
1282     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][0], 
1283     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][1], // note : one inner cluster
1284     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][2], 
1285     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][3] // note : another inner cluster
1286     //     };
1287 
1288     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] != 0) {continue;}
1289     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] != 0) {continue;}
1290 
1291     //     if (Mega_inner_clu_phi[ind_inner_mega[inner_i]] < 0 || Mega_inner_clu_phi[ind_inner_mega[inner_i]] >= 360) {cout<<"test: the mega inner cluster phi angle calculation is wrong, the value is : "<<Mega_inner_clu_phi[ind_inner_mega[inner_i]]<<endl;} // todo : this is a debug line
1292     //     int mega_clu_phi_index = int(Mega_inner_clu_phi[ind_inner_mega[inner_i]]);
1293 
1294     //     // note : outer cluster loop -1, 0, 1
1295     //     for (int scan_i = -1; scan_i < 2; scan_i++)
1296     //     {   
1297     //         int true_scan_i = ((mega_clu_phi_index + scan_i) < 0) ? 360 + (mega_clu_phi_index + scan_i) : ((mega_clu_phi_index + scan_i) > 359) ? (mega_clu_phi_index + scan_i)-360 : mega_clu_phi_index + scan_i;
1298 
1299     //         for (int outer_i; outer_i < outer_clu_phi_map[true_scan_i].size(); outer_i++)
1300     //         {
1301     //             // note : if the cluster is used, then skip
1302     //             if (outer_clu_phi_map[true_scan_i][outer_i].first == true) {continue;}
1303 
1304     //             // note : calculate the outer cluster phi with the consideration of the beam position
1305     //             Clus_OuterPhi_Offset = (outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_i].second.x - beam_origin.first) * (180./TMath::Pi());
1306                 
1307     //             // note : the delta phi cut between the inner-mega-cluster and the outer-cluster
1308     //             if ( fabs(get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Clus_OuterPhi_Offset)) > 0.6 ) { continue; }
1309 
1310     //             int id_inner_small_r = ( get_radius(inner_clu_phi_map[id_inner[0]][id_inner[1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[0]][id_inner[1]].second.y - beam_origin.second) < get_radius(inner_clu_phi_map[id_inner[2]][id_inner[3]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[2]][id_inner[3]].second.y - beam_origin.second) ) ? 0 : 2;
1311 
1312     //             pair<double,double> z_range_info = Get_possible_zvtx( 
1313     //                 0., // get_radius(beam_origin.first,beam_origin.second), 
1314     //                 {get_radius(inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.y - beam_origin.second), inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.z}, // note : unsign radius
1315     //                 {get_radius(outer_clu_phi_map[true_scan_i][outer_i].second.x - beam_origin.first, outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second), outer_clu_phi_map[true_scan_i][outer_i].second.z}  // note : unsign radius
1316     //             );
1317 
1318     //             // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
1319     //             if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
1320 
1321     //             cluster3_all_track_phi_1D   -> Fill(get_track_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Clus_OuterPhi_Offset)));
1322     //             cluster3_inner_track_phi_1D -> Fill(get_track_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Clus_OuterPhi_Offset)));
1323 
1324     //             NClu3_track_count += 1;
1325 
1326     //             // note : to mark the cluster as used 
1327     //             inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] += 1;
1328     //             inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] += 1;
1329 
1330     //             inner_clu_phi_map[id_inner[0]][id_inner[1]].first = true;
1331     //             inner_clu_phi_map[id_inner[2]][id_inner[3]].first = true;
1332     //             outer_clu_phi_map[true_scan_i][outer_i].first = true;
1333 
1334     //         }
1335     //     }
1336     // }
1337 
1338     // // note : 3 cluster track, Inner normal - Outer mega
1339     // for (int outer_i; outer_i < Mega_outer_clu_pair_index.size(); outer_i++) // note : the outer mega cluster loop
1340     // {
1341     //     int id_outer[4] = {
1342     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][0], 
1343     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][1], // note : one outer cluster
1344     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][2], 
1345     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][3] // note : another outer cluster
1346     //     };
1347 
1348     //     if (outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] != 0) {continue;}
1349     //     if (outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] != 0) {continue;}
1350 
1351     //     if (Mega_outer_clu_phi[ind_outer_mega[outer_i]] < 0 || Mega_outer_clu_phi[ind_outer_mega[outer_i]] >= 360) {cout<<"test: the mega outer cluster phi angle calculation is wrong, the value is : "<<Mega_outer_clu_phi[ind_outer_mega[outer_i]]<<endl;} // todo : this is a debug line
1352     //     int mega_clu_phi_index = int(Mega_outer_clu_phi[ind_outer_mega[outer_i]]);
1353 
1354     //     for (int scan_i = -1; scan_i < 2; scan_i++)
1355     //     {
1356     //         int true_scan_i = ((mega_clu_phi_index + scan_i) < 0) ? 360 + (mega_clu_phi_index + scan_i) : ((mega_clu_phi_index + scan_i) > 359) ? (mega_clu_phi_index + scan_i)-360 : mega_clu_phi_index + scan_i;
1357 
1358     //         for (int inner_i; inner_i < inner_clu_phi_map[true_scan_i].size(); inner_i++)
1359     //         {
1360     //             // note : if the cluster is used, then skip
1361     //             if (inner_clu_phi_map[true_scan_i][inner_i].first == true) {continue;}    
1362 
1363     //             // note : calculate the inner cluster phi with the consideration of the beam position
1364     //             Clus_InnerPhi_Offset = (inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_i].second.x - beam_origin.first) * (180./TMath::Pi());
1365 
1366     //             // note : the delta phi cut between the outer-mega-cluster and the inner-cluster
1367     //             if ( fabs(get_delta_phi(Mega_outer_clu_phi[ind_outer_mega[outer_i]], Clus_InnerPhi_Offset)) > 0.6 ) { continue; }
1368 
1369     //             int id_outer_big_r   = ( get_radius(outer_clu_phi_map[id_outer[0]][id_outer[1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[0]][id_outer[1]].second.y - beam_origin.second) > get_radius(outer_clu_phi_map[id_outer[2]][id_outer[3]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[2]][id_outer[3]].second.y - beam_origin.second) ) ? 0 : 2;
1370 
1371     //             pair<double,double> z_range_info = Get_possible_zvtx( 
1372     //                 0., // get_radius(beam_origin.first,beam_origin.second), 
1373     //                 {get_radius(inner_clu_phi_map[true_scan_i][inner_i].second.x - beam_origin.first, inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second), inner_clu_phi_map[true_scan_i][inner_i].second.z}, // note : unsign radius
1374     //                 {get_radius(outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.y - beam_origin.second), outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.z}  // note : unsign radius
1375     //             );
1376 
1377     //             // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
1378     //             if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
1379 
1380     //             cluster3_all_track_phi_1D   -> Fill(get_track_phi(Clus_InnerPhi_Offset, get_delta_phi(Clus_InnerPhi_Offset, Mega_outer_clu_phi[ind_outer_mega[outer_i]])));
1381     //             cluster3_outer_track_phi_1D -> Fill(get_track_phi(Clus_InnerPhi_Offset, get_delta_phi(Clus_InnerPhi_Offset, Mega_outer_clu_phi[ind_outer_mega[outer_i]])));
1382 
1383     //             NClu3_track_count += 1;
1384 
1385     //             // note : to mark the cluster as used 
1386     //             outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] += 1;
1387     //             outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] += 1;
1388 
1389     //             outer_clu_phi_map[id_outer[0]][id_outer[1]].first = true;
1390     //             outer_clu_phi_map[id_outer[2]][id_outer[3]].first = true;
1391     //             inner_clu_phi_map[true_scan_i][inner_i].first = true;
1392     //         }
1393     //     }
1394     // }
1395 
1396     // NClu4_track_centrality_2D -> Fill(centrality_map[centrality_bin], NClu4_track_count);
1397     // NClu3_track_centrality_2D -> Fill(centrality_map[centrality_bin], NClu3_track_count);
1398 
1399     // // note : for the mega cluster test only
1400     // return;
1401 
1402     cout<<"test_4"<<endl;
1403 
1404     // note : for two-cluster tracklets only
1405     for (int inner_phi_i = 0; inner_phi_i < 360; inner_phi_i++) // note : each phi cell (1 degree)
1406     {
1407         // note : N cluster in this phi cell
1408         for (int inner_phi_clu_i = 0; inner_phi_clu_i < inner_clu_phi_map[inner_phi_i].size(); inner_phi_clu_i++)
1409         {
1410             clu_multi_used_tight = 0;
1411             clu_multi_used_loose = 0;
1412             if (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].first == true) {continue;}
1413 
1414             Clus_InnerPhi_Offset = (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1415 
1416             // todo: change the outer phi scan range
1417             // note : the outer phi index, -4, -3, -2, -1, 0, 1, 2, 3, 4
1418             for (int scan_i = -4; scan_i < 5; scan_i++)
1419             {
1420                 int true_scan_i = ((inner_phi_i + scan_i) < 0) ? 360 + (inner_phi_i + scan_i) : ((inner_phi_i + scan_i) > 359) ? (inner_phi_i + scan_i)-360 : inner_phi_i + scan_i;
1421 
1422                 // note : N clusters in that outer phi cell
1423                 for (int outer_phi_clu_i = 0; outer_phi_clu_i < outer_clu_phi_map[true_scan_i].size(); outer_phi_clu_i++)
1424                 {
1425                     if (outer_clu_phi_map[true_scan_i][outer_phi_clu_i].first == true) {continue;}
1426 
1427                     Clus_OuterPhi_Offset = (outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1428                     double delta_phi = get_delta_phi(Clus_InnerPhi_Offset, Clus_OuterPhi_Offset);
1429                     
1430                     // if (fabs(delta_phi) > 5.72) {continue;}
1431                     if (fabs(delta_phi) > 3.5) {continue;}
1432 
1433                     double inner_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z});
1434                     double outer_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z});
1435                     double delta_eta = inner_clu_eta - outer_clu_eta;
1436 
1437                     track_delta_eta_1D[centrality_map[centrality_bin]] -> Fill( delta_eta );
1438                     track_delta_eta_1D[track_delta_eta_1D.size() - 1]  -> Fill( delta_eta );
1439 
1440                     track_DeltaPhi_DeltaEta_2D[centrality_map[centrality_bin]]        -> Fill(delta_phi, delta_eta);
1441                     track_DeltaPhi_DeltaEta_2D[track_DeltaPhi_DeltaEta_2D.size() - 1] -> Fill(delta_phi, delta_eta);
1442 
1443                     pair<double,double> z_range_info = Get_possible_zvtx( 
1444                         0., // get_radius(beam_origin.first,beam_origin.second), 
1445                         {get_radius(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second), inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z}, // note : unsign radius
1446                         {get_radius(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second), outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z}  // note : unsign radius
1447                     );
1448 
1449                     // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
1450                     if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
1451                     if (fabs(delta_phi) < 0.6) {clu_multi_used_tight += 1;} // todo : when doing the counting of the multi usage of inner tracks, the cut value is here 
1452                     track_delta_eta_1D_post[centrality_map[centrality_bin]]     -> Fill( delta_eta );
1453                     track_delta_eta_1D_post[track_delta_eta_1D_post.size() - 1] -> Fill( delta_eta );
1454 
1455                     double DCA_sign = calculateAngleBetweenVectors(
1456                         outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y,
1457                         inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y,
1458                         beam_origin.first, beam_origin.second
1459                     );
1460                     
1461                     track_DCA_distance[centrality_map[centrality_bin]] -> Fill( DCA_sign );
1462                     track_DCA_distance[track_DCA_distance.size() - 1]  -> Fill( DCA_sign ); 
1463 
1464                     track_phi_DCA_2D[centrality_map[centrality_bin]] -> Fill( delta_phi, DCA_sign );
1465                     track_phi_DCA_2D[track_phi_DCA_2D.size() - 1]    -> Fill( delta_phi, DCA_sign );
1466                     
1467                     track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( delta_phi );
1468                     track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( delta_phi );
1469 
1470                     if (fabs(delta_phi) < 1.5)
1471                     {
1472                         proto_pair_index.push_back({inner_phi_i, inner_phi_clu_i, true_scan_i, outer_phi_clu_i});
1473                         proto_pair_delta_phi_abs.push_back(fabs(delta_phi));
1474                         proto_pair_delta_phi.push_back({Clus_InnerPhi_Offset, Clus_OuterPhi_Offset, delta_phi});
1475                     }
1476 
1477 
1478 
1479                     // note : do the fill here (find the best match outer cluster with the inner cluster )
1480                     Get_eta_pair = Get_eta(
1481                         {0., evt_z.first,evt_z.second},
1482                         {get_radius(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second), inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z},
1483                         {get_radius(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second), outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z}
1484                     );  
1485 
1486                     // note : the code below is for the single 1D eta array
1487                     // // note : find the bin of the eta
1488                     // double eta_bin = eta_region_hist -> Fill(Get_eta_pair.second);
1489                     // // cout<<"test1 "<<eta_bin<<endl;
1490                     // if (eta_bin != -1)
1491                     // {
1492                     //     final_track_multi_delta_phi_1D[centrality_map[centrality_bin]][eta_bin - 1]            -> Fill(delta_phi);
1493                     //     final_track_multi_delta_phi_1D[final_track_multi_delta_phi_1D.size() - 1][eta_bin - 1] -> Fill(delta_phi);
1494 
1495                     //     if (fabs(delta_phi) <= signal_region) { 
1496                     //         good_tracklet_multi_counting[centrality_map[centrality_bin]][eta_bin - 1]          += 1;
1497                     //         good_tracklet_multi_counting[good_tracklet_multi_counting.size() - 1][eta_bin - 1] += 1;
1498                     //     }
1499                     // }
1500 
1501                     // cout<<"before eta_z_bin"<<endl;
1502                     // // note : the code below is for the 2D eta-z array
1503                     // double eta_z_bin = GetTH2Index1D(GetTH2BinXY(eta_z_region_hist_2D_map, eta_z_region_hist_2D_map -> Fill(Get_eta_pair.second, evt_z.first)), eta_z_region_hist_2D_map);
1504                     // cout<<"eta_z_bin : "<<eta_z_bin<<endl;
1505                     // if (eta_z_bin != -1)
1506                     // {
1507                     //     final_track_multi_delta_phi_1D[centrality_map[centrality_bin]][eta_z_bin]            -> Fill(delta_phi);
1508                     //     final_track_multi_delta_phi_1D[final_track_multi_delta_phi_1D.size() - 1][eta_z_bin] -> Fill(delta_phi);
1509 
1510                     //     if (fabs(delta_phi) <= signal_region) { 
1511                     //         good_tracklet_multi_counting[centrality_map[centrality_bin]][eta_z_bin]          += 1;
1512                     //         good_tracklet_multi_counting[good_tracklet_multi_counting.size() - 1][eta_z_bin] += 1;
1513                     //     }
1514                     // }
1515                     
1516                     
1517                     // if (clu_multi_used_loose == 0) 
1518                     // {
1519                     //     pair_delta_phi = delta_phi;
1520                     //     pair_outer_index = {true_scan_i, outer_phi_clu_i};
1521                     //     clu_multi_used_loose += 1;
1522                     // }
1523                     // else if (fabs(delta_phi) < fabs(pair_delta_phi))
1524                     // {
1525                     //     pair_delta_phi = delta_phi;
1526                     //     pair_outer_index = {true_scan_i, outer_phi_clu_i};
1527                     //     clu_multi_used_loose += 1;
1528                     // }
1529                 }
1530             } // note : end outer loop
1531 
1532             clu_used_centrality_2D -> Fill(total_NClus, clu_multi_used_tight);
1533 
1534             // // note : if there is no good match with inner and outer clusters, continue
1535             // if (clu_multi_used_loose == 0) {continue;}
1536 
1537             // // note : do the fill here (find the best match outer cluster with the inner cluster )
1538             // Get_eta_pair = Get_eta(
1539             //     {0., evt_z.first,evt_z.second},
1540             //     {get_radius(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second), inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z},
1541             //     {get_radius(outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.x - beam_origin.first, outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.y - beam_origin.second), outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.z}
1542             // );
1543 
1544             // double inner_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z});
1545             // double outer_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.x, outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.y, outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.z});
1546             // double track_phi = Clus_InnerPhi_Offset - (pair_delta_phi/2.);
1547 
1548             // if  (Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2. > 0.3)
1549             // {
1550             //     cout<<" "<<endl;
1551             //     cout<<"inner clu eta : "<<inner_clu_eta<<" outer clu eta : "<<outer_clu_eta<<"avg eta : "<< (inner_clu_eta + outer_clu_eta)/2. <<" reco eta : "<<Get_eta_pair.second<<" diff: "<<Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.<<endl;
1552             //     cout<<"inner clu pos : "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x<<" "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y<<" "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z<<endl;
1553             //     cout<<"outer clu pos : "<<outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.x<<" "<<outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.y<<" "<<outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.z<<endl;
1554             // }
1555 
1556             // reco_eta_correlation_2D -> Fill(Get_eta_pair.second, (inner_clu_eta + outer_clu_eta)/2.);
1557             // reco_eta_diff_reco3P_2D -> Fill(Get_eta_pair.second, Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
1558             // reco_eta_diff_1D        -> Fill(Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
1559 
1560             // // track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( pair_delta_phi );
1561             // // track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( pair_delta_phi );
1562 
1563             // track_DeltaPhi_eta_2D[centrality_map[centrality_bin]]   -> Fill(pair_delta_phi, Get_eta_pair.second);
1564             // track_DeltaPhi_eta_2D[track_DeltaPhi_eta_2D.size() - 1] -> Fill(pair_delta_phi, Get_eta_pair.second);
1565 
1566             // // cout<<"test_5"<<endl;
1567             // dNdeta_1D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second);
1568             // dNdeta_1D[dNdeta_1D.size() - 1]           -> Fill(Get_eta_pair.second);
1569 
1570             // track_eta_phi_2D[centrality_map[centrality_bin]] -> Fill(track_phi, Get_eta_pair.second);
1571             // track_eta_phi_2D[track_eta_phi_2D.size() - 1]    -> Fill(track_phi, Get_eta_pair.second);
1572             
1573             // track_eta_z_2D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second, evt_z.first);
1574             // track_eta_z_2D[track_eta_z_2D.size() - 1]      -> Fill(Get_eta_pair.second, evt_z.first);        
1575 
1576             // // note : find the bin of the eta
1577             // double eta_bin = eta_region_hist -> Fill(Get_eta_pair.second);
1578             // // cout<<"test1 "<<eta_bin<<endl;
1579             // if (eta_bin != -1)
1580             // {
1581             //     final_track_delta_phi_1D[centrality_map[centrality_bin]][eta_bin - 1]      -> Fill(pair_delta_phi);
1582             //     final_track_delta_phi_1D[final_track_delta_phi_1D.size() - 1][eta_bin - 1] -> Fill(pair_delta_phi);
1583 
1584             //     out_track_delta_phi_d.push_back(pair_delta_phi);
1585             //     out_track_eta_d.push_back(Get_eta_pair.second);
1586             //     out_track_eta_i.push_back(eta_bin);
1587             // }
1588 
1589             // evt_NTrack += 1;
1590             // // note : this outer cluster is used 
1591             // outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].first = true;
1592         }
1593 
1594         // cout<<"test_4.5, "<<inner_phi_i<<endl;
1595 
1596     } // note : end inner loop
1597 
1598     cout<<"test_5"<<endl;
1599 
1600     // note : if there is no good proto-track then move on to the next event
1601     if (proto_pair_delta_phi_abs.size() == 0) {return;}
1602 
1603     cout<<"test_5.5, vec_size: "<<proto_pair_delta_phi_abs.size()<<" zvtx "<<evt_z.first<<endl;
1604     long long vec_size = proto_pair_delta_phi_abs.size();
1605     long long ind[proto_pair_delta_phi_abs.size()];
1606     TMath::Sort(vec_size, &proto_pair_delta_phi_abs[0], ind, false);
1607     for (int pair_i = 0; pair_i < proto_pair_index.size(); pair_i++)
1608     {
1609         int inner_index_0 = proto_pair_index[ind[pair_i]][0];
1610         int inner_index_1 = proto_pair_index[ind[pair_i]][1];
1611         int outer_index_0 = proto_pair_index[ind[pair_i]][2];
1612         int outer_index_1 = proto_pair_index[ind[pair_i]][3];
1613 
1614         // cout<<"test: the pair delta phi abs: "<<proto_pair_delta_phi_abs[ind[pair_i]]<<endl;
1615         if (inner_used_clu[Form("%i_%i", inner_index_0, inner_index_1)] != 0) { inner_used_clu[Form("%i_%i", inner_index_0, inner_index_1)] += 1; continue;}
1616         if (outer_used_clu[Form("%i_%i", outer_index_0, outer_index_1)] != 0) { outer_used_clu[Form("%i_%i", outer_index_0, outer_index_1)] += 1; continue;}
1617         double delta_phi = proto_pair_delta_phi[ind[pair_i]][2];
1618         double track_phi = get_track_phi(proto_pair_delta_phi[ind[pair_i]][0], delta_phi); // proto_pair_delta_phi[ind[pair_i]][0] - (delta_phi/2.);
1619 
1620         // note : do the fill here (find the best match outer cluster with the inner cluster )
1621         Get_eta_pair = Get_eta(
1622             {0., evt_z.first,evt_z.second},
1623             {get_radius(inner_clu_phi_map[inner_index_0][inner_index_1].second.x - beam_origin.first, inner_clu_phi_map[inner_index_0][inner_index_1].second.y - beam_origin.second), inner_clu_phi_map[inner_index_0][inner_index_1].second.z},
1624             {get_radius(outer_clu_phi_map[outer_index_0][outer_index_1].second.x - beam_origin.first, outer_clu_phi_map[outer_index_0][outer_index_1].second.y - beam_origin.second), outer_clu_phi_map[outer_index_0][outer_index_1].second.z}
1625         );
1626 
1627         double inner_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{inner_clu_phi_map[inner_index_0][inner_index_1].second.x, inner_clu_phi_map[inner_index_0][inner_index_1].second.y, inner_clu_phi_map[inner_index_0][inner_index_1].second.z});
1628         double outer_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{outer_clu_phi_map[outer_index_0][outer_index_1].second.x, outer_clu_phi_map[outer_index_0][outer_index_1].second.y, outer_clu_phi_map[outer_index_0][outer_index_1].second.z});
1629         
1630         if  (Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2. > 0.3)
1631         {
1632             cout<<" "<<endl;
1633             cout<<"inner clu eta : "<<inner_clu_eta<<" outer clu eta : "<<outer_clu_eta<<"avg eta : "<< (inner_clu_eta + outer_clu_eta)/2. <<" reco eta : "<<Get_eta_pair.second<<" diff: "<<Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.<<endl;
1634             cout<<"inner clu pos : "<<inner_clu_phi_map[inner_index_0][inner_index_1].second.x<<" "<<inner_clu_phi_map[inner_index_0][inner_index_1].second.y<<" "<<inner_clu_phi_map[inner_index_0][inner_index_1].second.z<<endl;
1635             cout<<"outer clu pos : "<<outer_clu_phi_map[outer_index_0][outer_index_1].second.x<<" "<<outer_clu_phi_map[outer_index_0][outer_index_1].second.y<<" "<<outer_clu_phi_map[outer_index_0][outer_index_1].second.z<<endl;
1636         }
1637 
1638         reco_eta_correlation_2D -> Fill(Get_eta_pair.second, (inner_clu_eta + outer_clu_eta)/2.);
1639         reco_eta_diff_reco3P_2D -> Fill(Get_eta_pair.second, Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
1640         reco_eta_diff_1D        -> Fill(Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
1641 
1642         // track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( delta_phi );
1643         // track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( delta_phi );
1644 
1645         track_DeltaPhi_eta_2D[centrality_map[centrality_bin]]   -> Fill(delta_phi, Get_eta_pair.second);
1646         track_DeltaPhi_eta_2D[track_DeltaPhi_eta_2D.size() - 1] -> Fill(delta_phi, Get_eta_pair.second);
1647 
1648         // cout<<"test_5"<<endl;
1649         if (fabs(delta_phi) <= signal_region)
1650         {
1651             dNdeta_1D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second);
1652             dNdeta_1D[dNdeta_1D.size() - 1]           -> Fill(Get_eta_pair.second);
1653 
1654             track_eta_z_2D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second, evt_z.first);
1655             track_eta_z_2D[track_eta_z_2D.size() - 1]      -> Fill(Get_eta_pair.second, evt_z.first);
1656 
1657             evt_NTrack += 1;
1658         }
1659         
1660 
1661         track_eta_phi_2D[centrality_map[centrality_bin]] -> Fill(track_phi, Get_eta_pair.second);
1662         track_eta_phi_2D[track_eta_phi_2D.size() - 1]    -> Fill(track_phi, Get_eta_pair.second);
1663         
1664         // // note : find the bin of the eta
1665         // double eta_bin = eta_region_hist -> Fill(Get_eta_pair.second);
1666         // // cout<<"test1 "<<eta_bin<<endl;
1667         // if (eta_bin != -1)
1668         // {
1669         //     final_track_delta_phi_1D[centrality_map[centrality_bin]][eta_bin - 1]      -> Fill(delta_phi);
1670         //     final_track_delta_phi_1D[final_track_delta_phi_1D.size() - 1][eta_bin - 1] -> Fill(delta_phi);
1671 
1672         //     if (fabs(delta_phi) <= signal_region) { 
1673         //         good_tracklet_counting[centrality_map[centrality_bin]][eta_bin - 1] += 1;
1674         //         good_tracklet_counting[good_tracklet_counting.size() - 1][eta_bin - 1] += 1;
1675         //     }
1676 
1677         //     out_track_delta_phi_d.push_back(delta_phi);
1678         //     out_track_eta_d.push_back(Get_eta_pair.second);
1679         //     out_track_eta_i.push_back(eta_bin);
1680         // }
1681 
1682         // note : the code below is for the 2D eta-z array
1683         double eta_z_bin = GetTH2Index1D(GetTH2BinXY(eta_z_region_hist_2D_map, eta_z_region_hist_2D_map -> Fill(Get_eta_pair.second, evt_z.first)), eta_z_region_hist_2D_map);
1684         if (eta_z_bin != -1)
1685         {
1686             final_track_delta_phi_1D[centrality_map[centrality_bin]][eta_z_bin]      -> Fill(delta_phi);
1687             final_track_delta_phi_1D[final_track_delta_phi_1D.size() - 1][eta_z_bin] -> Fill(delta_phi);
1688 
1689             if (fabs(delta_phi) <= signal_region) { 
1690                 good_tracklet_counting[centrality_map[centrality_bin]][eta_z_bin] += 1;
1691                 good_tracklet_counting[good_tracklet_counting.size() - 1][eta_z_bin] += 1;
1692             }
1693 
1694             out_track_delta_phi_d.push_back(delta_phi);
1695             out_track_eta_d.push_back(Get_eta_pair.second);
1696             out_track_eta_i.push_back(eta_z_bin);
1697         }
1698 
1699         
1700 
1701         // note : since the clusters are used in the tracklet, mark the clusters as used
1702         inner_used_clu[Form("%i_%i", inner_index_0, inner_index_1)] += 1;
1703         outer_used_clu[Form("%i_%i", outer_index_0, outer_index_1)] += 1;
1704     }
1705 
1706     cout<<"test_6"<<endl;
1707 
1708     out_eID = event_i;
1709     out_evt_centrality_bin = centrality_bin;
1710     out_evt_zvtx = evt_z.first;
1711     tree_out -> Fill();
1712 
1713     cout<<"test_7"<<endl;
1714 
1715     // cout<<" "<<endl;
1716     // cout<<" "<<endl;
1717     // cout<<"test_8"<<endl;
1718     if (run_type == "MC")
1719     {
1720         track_correlation_2D -> Fill(evt_NTrack_MC, evt_NTrack);
1721         track_ratio_2D -> Fill(evt_NTrack_MC, double(evt_NTrack)/double(evt_NTrack_MC));
1722         track_ratio_1D[centrality_map[centrality_bin]] -> Fill( double(evt_NTrack) / double(evt_NTrack_MC) );
1723         track_ratio_1D[track_ratio_1D.size() - 1]      -> Fill( double(evt_NTrack) / double(evt_NTrack_MC) );
1724 
1725         track_cluster_ratio_1D_MC[centrality_map[centrality_bin]]       -> Fill( double(effective_total_NClus) / double(evt_NTrack_MC) );
1726         track_cluster_ratio_1D_MC[track_cluster_ratio_1D_MC.size() - 1] -> Fill( double(effective_total_NClus) / double(evt_NTrack_MC) );    
1727         track_cluster_ratio_multiplicity_2D_MC -> Fill( effective_total_NClus, double(effective_total_NClus) / double(evt_NTrack_MC) );
1728     }
1729 
1730     cout<<"test_8"<<endl;
1731         
1732     track_cluster_ratio_multiplicity_2D -> Fill( effective_total_NClus, double(effective_total_NClus) / double(evt_NTrack) );
1733     track_cluster_ratio_1D[centrality_map[centrality_bin]]    -> Fill( double(effective_total_NClus) / double(evt_NTrack) );
1734     track_cluster_ratio_1D[track_cluster_ratio_1D.size() - 1] -> Fill( double(effective_total_NClus) / double(evt_NTrack) );
1735 
1736     cout<<"test_9"<<endl;
1737 
1738     // if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0){print_evt_plot(event_i, evt_NTrack_MC, inner_NClu, outer_NClu);}
1739     return_tag = 1;
1740 
1741     cout<<"test_10"<<endl;
1742 }
1743 
1744 
1745 // // note : this function is for the event by event vertex calculation
1746 // // note : this function is the new method, which means that we first put the cluster into a phi map, and then there are two for loops still, but we only check the certain range of the phi 
1747 // // note : try the method that allows single cluster to be used multiple times
1748 // // note : so the background subtraction is needed
1749 // void INTTEta::ProcessEvt(int event_i, vector<clu_info> temp_sPH_inner_nocolumn_vec, vector<clu_info> temp_sPH_outer_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_vec, vector<vector<double>> temp_sPH_nocolumn_rz_vec, int NvtxMC, vector<double> TrigvtxMC, bool PhiCheckTag, Long64_t bco_full, pair<double,double> evt_z, int centrality_bin, vector<vector<float>> true_track_info){ // note : evt_z : {z, width}
1750 //     return_tag = 0;
1751 
1752 //     if (event_i%1 == 0) {cout<<"In INTTEta class, running event : "<<event_i<<endl;}
1753 
1754 //     inner_NClu = temp_sPH_inner_nocolumn_vec.size();
1755 //     outer_NClu = temp_sPH_outer_nocolumn_vec.size();
1756 //     total_NClus = inner_NClu + outer_NClu;
1757 
1758 //     // cout<<"test_0"<<endl;
1759 //     if (total_NClus < zvtx_cal_require) {return; cout<<"return confirmation"<<endl;}   
1760     
1761 //     if (run_type == "MC" && NvtxMC != 1) { return; cout<<"In INTTEta class, event : "<<event_i<<" Nvtx : "<<NvtxMC<<" Nvtx more than one "<<endl;}
1762 //     if (PhiCheckTag == false)            { return; cout<<"In INTTEta class, event : "<<event_i<<" Nvtx : "<<NvtxMC<<" Not full phi has hits "<<endl;}
1763     
1764 //     if (inner_NClu < 10 || outer_NClu < 10 || total_NClus > N_clu_cut || total_NClus < N_clu_cutl)
1765 //     {
1766 //         return;
1767 //         printf("In INTTEta class, event : %i, low clu continue, NClus : %lu \n", event_i, total_NClus); 
1768 //     }
1769 
1770 //     // todo : the z vertex range is here
1771 //     if (-220 > evt_z.first + evt_z.second || -180 < evt_z.first - evt_z.second) {return;}
1772 //     // if (-100 > evt_z.first + evt_z.second || 100 < evt_z.first - evt_z.second) {return;}
1773     
1774     
1775 //     N_GoodEvent += 1;
1776 //     N_GoodEvent_vec[centrality_map[centrality_bin]] += 1;
1777 
1778 //     // cout<<"N inner cluster : "<<inner_NClu<<" N outer cluster : "<<outer_NClu<<endl;
1779 
1780 //     double INTT_eta_acceptance_l = -0.5 * TMath::Log((sqrt(pow(-230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))-(-230.-TrigvtxMC[2]*10.)) / (sqrt(pow(-230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))+(-230.-TrigvtxMC[2]*10.))); // note : left
1781 //     double INTT_eta_acceptance_r =  -0.5 * TMath::Log((sqrt(pow(230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))-(230.-TrigvtxMC[2]*10.)) / (sqrt(pow(230.-TrigvtxMC[2]*10.,2)+pow(INTT_layer_R[3],2))+(230.-TrigvtxMC[2]*10.))); // note : right
1782 
1783 //     if (run_type == "MC")
1784 //     {
1785 //         // note : for the true track case ----------------------------------------------------------------------------------------------------------------------------------------------------------------
1786 //         // if (event_i % 100 == 0){cout<<"z : "<<TrigvtxMC[2]*10.<<" eta : "<<INTT_eta_acceptance_l<<" "<<INTT_eta_acceptance_r<<endl;}
1787 
1788 //         // cout<<"true_track_info : "<<true_track_info.size()<<endl;    
1789 //         for (int track_i = 0; track_i < true_track_info.size(); track_i++)
1790 //         {
1791 //             if (true_track_info[track_i][2] == 111 || true_track_info[track_i][2] == 22 || abs(true_track_info[track_i][2]) == 2112){continue;}
1792 
1793 //             if (true_track_info[track_i][0] > INTT_eta_acceptance_l && true_track_info[track_i][0] < INTT_eta_acceptance_r)
1794 //             {
1795 //                 dNdeta_1D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0]);
1796 //                 dNdeta_1D_MC[dNdeta_1D_MC.size() - 1]        -> Fill(true_track_info[track_i][0]);   
1797 //                 final_dNdeta_1D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0]);
1798 //                 final_dNdeta_1D_MC[dNdeta_1D_MC.size() - 1]        -> Fill(true_track_info[track_i][0]);
1799 //                 track_eta_z_2D_MC[centrality_map[centrality_bin]] -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);
1800 //                 track_eta_z_2D_MC[track_eta_z_2D_MC.size() - 1]   -> Fill(true_track_info[track_i][0], TrigvtxMC[2]*10.);    
1801 
1802 //                 // cout<<"true track eta : "<<true_track_info[track_i][0]<<" phi : "<<convertTo360(true_track_info[track_i][1])<<endl;
1803 //                 // cout<<"("<<true_track_info[track_i][0]<<", "<<convertTo360(true_track_info[track_i][1])<<"), ";
1804 
1805 //                 evt_true_track_gr -> SetPoint(evt_true_track_gr->GetN(),true_track_info[track_i][0], convertTo360(true_track_info[track_i][1]));
1806 
1807 //                 evt_NTrack_MC += 1;
1808 //             }
1809 //         }
1810 //         // if (evt_NTrack_MC < 10) {cout<<"evt : "<<event_i<<" ---- N reco track : "<<evt_NTrack<<" N true track : "<<evt_NTrack_MC<<" ratio : "<<double(evt_NTrack) / double(evt_NTrack_MC)<<endl;}
1811 //     }
1812 
1813 //     // note : put the cluster into the phi map, the first bool is for the cluster usage.
1814 //     // note : false means the cluster is not used
1815 //     for (int inner_i = 0; inner_i < temp_sPH_inner_nocolumn_vec.size(); inner_i++) {
1816 //         Clus_InnerPhi_Offset = (temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second < 0) ? atan2(temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second, temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(temp_sPH_inner_nocolumn_vec[inner_i].y - beam_origin.second, temp_sPH_inner_nocolumn_vec[inner_i].x - beam_origin.first) * (180./TMath::Pi());
1817 //         inner_clu_phi_map[ int(Clus_InnerPhi_Offset) ].push_back({false,temp_sPH_inner_nocolumn_vec[inner_i]});
1818 
1819 //         double clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{temp_sPH_inner_nocolumn_vec[inner_i].x, temp_sPH_inner_nocolumn_vec[inner_i].y, temp_sPH_inner_nocolumn_vec[inner_i].z});
1820 //         if (clu_eta > INTT_eta_acceptance_l && clu_eta < INTT_eta_acceptance_r) {effective_total_NClus += 1;}
1821 //     }
1822 //     for (int outer_i = 0; outer_i < temp_sPH_outer_nocolumn_vec.size(); outer_i++) {
1823 //         Clus_OuterPhi_Offset = (temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second < 0) ? atan2(temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second, temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(temp_sPH_outer_nocolumn_vec[outer_i].y - beam_origin.second, temp_sPH_outer_nocolumn_vec[outer_i].x - beam_origin.first) * (180./TMath::Pi());
1824 //         outer_clu_phi_map[ int(Clus_OuterPhi_Offset) ].push_back({false,temp_sPH_outer_nocolumn_vec[outer_i]});
1825 
1826 //         double clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{temp_sPH_outer_nocolumn_vec[outer_i].x, temp_sPH_outer_nocolumn_vec[outer_i].y, temp_sPH_outer_nocolumn_vec[outer_i].z});
1827 //         if (clu_eta > INTT_eta_acceptance_l && clu_eta < INTT_eta_acceptance_r) {effective_total_NClus += 1;}
1828 //     }
1829 
1830 //     // // note : find the Mega cluster preparation for inner barrel 
1831 //     // for (int inner_phi_i = 0; inner_phi_i < 360; inner_phi_i++)
1832 //     // {
1833 //     //     for (int inner_phi_clu_i = 0; inner_phi_clu_i < inner_clu_phi_map[inner_phi_i].size(); inner_phi_clu_i++)
1834 //     //     {
1835 //     //         // note : if the cluster is used, then skip
1836 //     //         if (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].first == true) {continue;}
1837 
1838 //     //         Clus_InnerPhi_Offset_1 = (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1839 
1840 //     //         // note : the scan range of the -1, 0, 1
1841 //     //         for (int scan_i = -1; scan_i < 2; scan_i++)
1842 //     //         {
1843 //     //             int true_scan_i = ((inner_phi_i + scan_i) < 0) ? 360 + (inner_phi_i + scan_i) : ((inner_phi_i + scan_i) > 359) ? (inner_phi_i + scan_i)-360 : inner_phi_i + scan_i;
1844 //     //             for (int inner_scan_clu_i = 0; inner_scan_clu_i < inner_clu_phi_map[true_scan_i].size(); inner_scan_clu_i++)
1845 //     //             {
1846 //     //                 // note : if the cluster is used, then skip
1847 //     //                 if (inner_clu_phi_map[true_scan_i][inner_scan_clu_i].first == true) {continue;}
1848 
1849 //     //                 // note : the cluster itself
1850 //     //                 if (true_scan_i == inner_phi_i && inner_phi_clu_i == inner_scan_clu_i) {continue;}
1851                     
1852 //     //                 // note : if it has the same sub layer ID, then skip
1853 //     //                 // todo : this cut may only work for the MC, for the data, it requires additional check
1854 //     //                 if (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.layer == inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.layer) {continue;}
1855 
1856 //     //                 // note : I expect the two cluster have to have the same z position
1857 //     //                 // note : but in case of data, the z position of the same strip may be fluctuated a little bit 
1858 //     //                 // todo : currently, set the Z position flutuation to be 4 mm
1859 //     //                 if (fabs(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z - inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.z) > 4 ) {continue;}
1860 
1861 //     //                 Clus_InnerPhi_Offset_2 = (inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1862 
1863 //     //                 double delta_phi = get_delta_phi(Clus_InnerPhi_Offset_1, Clus_InnerPhi_Offset_2);
1864 
1865 //     //                 // note : if the two cluster are too far away in phi angle, the skip
1866 //     //                 // todo : the delta phi cut may need to be adjusted
1867 //     //                 if (fabs( delta_phi ) > 0.6) {continue;}
1868 
1869 //     //                 // note : the pair that passed the cut mentioned above can be considered as a proto_mega_cluster
1870 //     //                 Mega_inner_clu_pair_index.push_back({{inner_phi_i, inner_phi_clu_i, true_scan_i, inner_scan_clu_i}});
1871 //     //                 Mega_inner_clu_delta_phi_abs.push_back(fabs(delta_phi));
1872 //     //                 Mega_inner_clu_phi.push_back( get_track_phi(Clus_InnerPhi_Offset_1, delta_phi) );
1873 //     //             }
1874 //     //         }
1875 //     //     }
1876 //     // }
1877 
1878 //     // // note : finr the Mega cluste preparation for outer barrel 
1879 //     // for (int outer_phi_i = 0; outer_phi_i < 360; outer_phi_i++)
1880 //     // {
1881 //     //     for (int outer_phi_clu_i = 0; outer_phi_clu_i < outer_clu_phi_map[outer_phi_i].size(); outer_phi_clu_i++)
1882 //     //     {
1883 //     //         // note : if the cluster is used, then skip
1884 //     //         if (outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].first == true) {continue;}
1885 
1886 //     //         Clus_OuterPhi_Offset_1 = (outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1887 
1888 //     //         // note : the scan range of the -1, 0, 1
1889 //     //         for (int scan_i = -1; scan_i < 2; scan_i++)
1890 //     //         {
1891 //     //             int true_scan_i = ((outer_phi_i + scan_i) < 0) ? 360 + (outer_phi_i + scan_i) : ((outer_phi_i + scan_i) > 359) ? (outer_phi_i + scan_i)-360 : outer_phi_i + scan_i;
1892 //     //             for (int outer_scan_clu_i = 0; outer_scan_clu_i < outer_clu_phi_map[true_scan_i].size(); outer_scan_clu_i++)
1893 //     //             {
1894 //     //                 // note : if the cluster is used, then skip
1895 //     //                 if (outer_clu_phi_map[true_scan_i][outer_scan_clu_i].first == true) {continue;}
1896 
1897 //     //                 // note : the cluster itself
1898 //     //                 if (true_scan_i == outer_phi_i && outer_phi_clu_i == outer_scan_clu_i) {continue;}
1899                     
1900 //     //                 // note : if it has the same sub layer ID, then skip
1901 //     //                 // todo : this cut may only work for the MC, for the data, it requires additional check
1902 //     //                 if (outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.layer == outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.layer) {continue;}
1903 
1904 //     //                 // note : I expect the two cluster have to have the same z position
1905 //     //                 // note : but in case of data, the z position of the same strip may be fluctuated a little bit 
1906 //     //                 // todo : currently, set the Z position flutuation to be 4 mm
1907 //     //                 if (fabs(outer_clu_phi_map[outer_phi_i][outer_phi_clu_i].second.z - outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.z) > 4 ) {continue;}
1908 
1909 //     //                 Clus_OuterPhi_Offset_2 = (outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_scan_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
1910 
1911 //     //                 double delta_phi = get_delta_phi(Clus_OuterPhi_Offset_1, Clus_OuterPhi_Offset_2);
1912 
1913 //     //                 // note : if the two cluster are too far away in phi angle, the skip
1914 //     //                 // todo : the delta phi cut may need to be adjusted
1915 //     //                 if (fabs(delta_phi) > 0.6) {continue;}
1916 
1917 //     //                 // note : the pair that passed the cut mentioned above can be considered as a proto_mega_cluster
1918 //     //                 Mega_outer_clu_pair_index.push_back({{outer_phi_i, outer_phi_clu_i, true_scan_i, outer_scan_clu_i}});
1919 //     //                 Mega_outer_clu_delta_phi_abs.push_back(fabs(delta_phi));
1920 //     //                 Mega_outer_clu_phi.push_back( get_track_phi(Clus_OuterPhi_Offset_1, delta_phi) );
1921 //     //             }
1922 //     //         }
1923 //     //     }
1924 //     // }
1925 
1926 //     // // note : try to sort the pair of the Inner Mega cluster by the abs delta phi
1927 //     // long long inner_mega_vec_size = Mega_inner_clu_delta_phi_abs.size();
1928 //     // long long ind_inner_mega[Mega_inner_clu_delta_phi_abs.size()];
1929 //     // TMath::Sort(inner_mega_vec_size, &Mega_inner_clu_delta_phi_abs[0], ind_inner_mega, false);
1930 
1931 //     // // note : try to sort the pair of the Outer Mega cluster by the abs delta phi
1932 //     // long long outer_mega_vec_size = Mega_outer_clu_delta_phi_abs.size();
1933 //     // long long ind_outer_mega[Mega_outer_clu_delta_phi_abs.size()];
1934 //     // TMath::Sort(outer_mega_vec_size, &Mega_outer_clu_delta_phi_abs[0], ind_outer_mega, false);
1935 
1936 //     // // note : 4 cluster track, Inner mega - Outer mega
1937 //     // for (int inner_i; inner_i < Mega_inner_clu_pair_index.size(); inner_i++)
1938 //     // {
1939 //     //     int id_inner[4] = {
1940 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][0], 
1941 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][1], // note : one inner cluster
1942 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][2], 
1943 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][3] // note : another inner cluster
1944 //     //     };
1945 
1946 //     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] != 0) {continue;}
1947 //     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] != 0) {continue;}
1948 
1949 //     //     for (int outer_i; outer_i < Mega_outer_clu_pair_index.size(); outer_i++)
1950 //     //     {
1951 //     //         int id_outer[4] = {
1952 //     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][0], 
1953 //     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][1], //  note : one outer cluster 
1954 //     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][2], 
1955 //     //             Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][3] // note : abother outer cluster
1956 //     //         };
1957             
1958 //     //         if (outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] != 0) {continue;}
1959 //     //         if (outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] != 0) {continue;}
1960 
1961 //     //         // note : the delta phi cut
1962 //     //         // todo : the delta phi cut value is fixed here
1963 //     //         if (fabs(get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Mega_outer_clu_phi[ind_outer_mega[outer_i]])) > 0.6) {continue;}
1964             
1965 //     //         int id_inner_small_r = ( get_radius(inner_clu_phi_map[id_inner[0]][id_inner[1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[0]][id_inner[1]].second.y - beam_origin.second) < get_radius(inner_clu_phi_map[id_inner[2]][id_inner[3]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[2]][id_inner[3]].second.y - beam_origin.second) ) ? 0 : 2;
1966 //     //         int id_outer_big_r   = ( get_radius(outer_clu_phi_map[id_outer[0]][id_outer[1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[0]][id_outer[1]].second.y - beam_origin.second) > get_radius(outer_clu_phi_map[id_outer[2]][id_outer[3]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[2]][id_outer[3]].second.y - beam_origin.second) ) ? 0 : 2;
1967 
1968 //     //         pair<double,double> z_range_info = Get_possible_zvtx( 
1969 //     //             0., // get_radius(beam_origin.first,beam_origin.second), 
1970 //     //             {get_radius(inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.y - beam_origin.second), inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.z}, // note : unsign radius
1971 //     //             {get_radius(outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.y - beam_origin.second), outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.z}  // note : unsign radius
1972 //     //         );
1973 
1974 //     //         // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
1975 //     //         if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
1976 
1977 //     //         cluster4_track_phi_1D -> Fill(get_track_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Mega_outer_clu_phi[ind_outer_mega[outer_i]])));
1978 
1979 //     //         NClu4_track_count += 1;
1980 
1981 //     //         // note : to mark the cluster as used 
1982 //     //         inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] += 1;
1983 //     //         inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] += 1;
1984 //     //         outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] += 1;
1985 //     //         outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] += 1;
1986 
1987 //     //         inner_clu_phi_map[id_inner[0]][id_inner[1]].first = true;
1988 //     //         inner_clu_phi_map[id_inner[2]][id_inner[3]].first = true;
1989 //     //         outer_clu_phi_map[id_outer[0]][id_outer[1]].first = true;
1990 //     //         outer_clu_phi_map[id_outer[2]][id_outer[3]].first = true;
1991 //     //     }
1992 //     // }
1993 
1994 //     // // note : 3 cluster track, Inner mega - Outer normal
1995 //     // for (int inner_i; inner_i < Mega_inner_clu_pair_index.size(); inner_i++) // note : the inner mega cluster loop
1996 //     // {
1997 //     //     int id_inner[4] = {
1998 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][0], 
1999 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][1], // note : one inner cluster
2000 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][2], 
2001 //     //         Mega_inner_clu_pair_index[ind_inner_mega[inner_i]][3] // note : another inner cluster
2002 //     //     };
2003 
2004 //     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] != 0) {continue;}
2005 //     //     if (inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] != 0) {continue;}
2006 
2007 //     //     if (Mega_inner_clu_phi[ind_inner_mega[inner_i]] < 0 || Mega_inner_clu_phi[ind_inner_mega[inner_i]] >= 360) {cout<<"test: the mega inner cluster phi angle calculation is wrong, the value is : "<<Mega_inner_clu_phi[ind_inner_mega[inner_i]]<<endl;} // todo : this is a debug line
2008 //     //     int mega_clu_phi_index = int(Mega_inner_clu_phi[ind_inner_mega[inner_i]]);
2009 
2010 //     //     // note : outer cluster loop -1, 0, 1
2011 //     //     for (int scan_i = -1; scan_i < 2; scan_i++)
2012 //     //     {   
2013 //     //         int true_scan_i = ((mega_clu_phi_index + scan_i) < 0) ? 360 + (mega_clu_phi_index + scan_i) : ((mega_clu_phi_index + scan_i) > 359) ? (mega_clu_phi_index + scan_i)-360 : mega_clu_phi_index + scan_i;
2014 
2015 //     //         for (int outer_i; outer_i < outer_clu_phi_map[true_scan_i].size(); outer_i++)
2016 //     //         {
2017 //     //             // note : if the cluster is used, then skip
2018 //     //             if (outer_clu_phi_map[true_scan_i][outer_i].first == true) {continue;}
2019 
2020 //     //             // note : calculate the outer cluster phi with the consideration of the beam position
2021 //     //             Clus_OuterPhi_Offset = (outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_i].second.x - beam_origin.first) * (180./TMath::Pi());
2022                 
2023 //     //             // note : the delta phi cut between the inner-mega-cluster and the outer-cluster
2024 //     //             if ( fabs(get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Clus_OuterPhi_Offset)) > 0.6 ) { continue; }
2025 
2026 //     //             int id_inner_small_r = ( get_radius(inner_clu_phi_map[id_inner[0]][id_inner[1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[0]][id_inner[1]].second.y - beam_origin.second) < get_radius(inner_clu_phi_map[id_inner[2]][id_inner[3]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[2]][id_inner[3]].second.y - beam_origin.second) ) ? 0 : 2;
2027 
2028 //     //             pair<double,double> z_range_info = Get_possible_zvtx( 
2029 //     //                 0., // get_radius(beam_origin.first,beam_origin.second), 
2030 //     //                 {get_radius(inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.x - beam_origin.first, inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.y - beam_origin.second), inner_clu_phi_map[id_inner[id_inner_small_r]][id_inner[id_inner_small_r+1]].second.z}, // note : unsign radius
2031 //     //                 {get_radius(outer_clu_phi_map[true_scan_i][outer_i].second.x - beam_origin.first, outer_clu_phi_map[true_scan_i][outer_i].second.y - beam_origin.second), outer_clu_phi_map[true_scan_i][outer_i].second.z}  // note : unsign radius
2032 //     //             );
2033 
2034 //     //             // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
2035 //     //             if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
2036 
2037 //     //             cluster3_all_track_phi_1D   -> Fill(get_track_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Clus_OuterPhi_Offset)));
2038 //     //             cluster3_inner_track_phi_1D -> Fill(get_track_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], get_delta_phi(Mega_inner_clu_phi[ind_inner_mega[inner_i]], Clus_OuterPhi_Offset)));
2039 
2040 //     //             NClu3_track_count += 1;
2041 
2042 //     //             // note : to mark the cluster as used 
2043 //     //             inner_used_mega_clu[Form("%i_%i", id_inner[0], id_inner[1])] += 1;
2044 //     //             inner_used_mega_clu[Form("%i_%i", id_inner[2], id_inner[3])] += 1;
2045 
2046 //     //             inner_clu_phi_map[id_inner[0]][id_inner[1]].first = true;
2047 //     //             inner_clu_phi_map[id_inner[2]][id_inner[3]].first = true;
2048 //     //             outer_clu_phi_map[true_scan_i][outer_i].first = true;
2049 
2050 //     //         }
2051 //     //     }
2052 //     // }
2053 
2054 //     // // note : 3 cluster track, Inner normal - Outer mega
2055 //     // for (int outer_i; outer_i < Mega_outer_clu_pair_index.size(); outer_i++) // note : the outer mega cluster loop
2056 //     // {
2057 //     //     int id_outer[4] = {
2058 //     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][0], 
2059 //     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][1], // note : one outer cluster
2060 //     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][2], 
2061 //     //         Mega_outer_clu_pair_index[ind_outer_mega[outer_i]][3] // note : another outer cluster
2062 //     //     };
2063 
2064 //     //     if (outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] != 0) {continue;}
2065 //     //     if (outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] != 0) {continue;}
2066 
2067 //     //     if (Mega_outer_clu_phi[ind_outer_mega[outer_i]] < 0 || Mega_outer_clu_phi[ind_outer_mega[outer_i]] >= 360) {cout<<"test: the mega outer cluster phi angle calculation is wrong, the value is : "<<Mega_outer_clu_phi[ind_outer_mega[outer_i]]<<endl;} // todo : this is a debug line
2068 //     //     int mega_clu_phi_index = int(Mega_outer_clu_phi[ind_outer_mega[outer_i]]);
2069 
2070 //     //     for (int scan_i = -1; scan_i < 2; scan_i++)
2071 //     //     {
2072 //     //         int true_scan_i = ((mega_clu_phi_index + scan_i) < 0) ? 360 + (mega_clu_phi_index + scan_i) : ((mega_clu_phi_index + scan_i) > 359) ? (mega_clu_phi_index + scan_i)-360 : mega_clu_phi_index + scan_i;
2073 
2074 //     //         for (int inner_i; inner_i < inner_clu_phi_map[true_scan_i].size(); inner_i++)
2075 //     //         {
2076 //     //             // note : if the cluster is used, then skip
2077 //     //             if (inner_clu_phi_map[true_scan_i][inner_i].first == true) {continue;}    
2078 
2079 //     //             // note : calculate the inner cluster phi with the consideration of the beam position
2080 //     //             Clus_InnerPhi_Offset = (inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second, inner_clu_phi_map[true_scan_i][inner_i].second.x - beam_origin.first) * (180./TMath::Pi());
2081 
2082 //     //             // note : the delta phi cut between the outer-mega-cluster and the inner-cluster
2083 //     //             if ( fabs(get_delta_phi(Mega_outer_clu_phi[ind_outer_mega[outer_i]], Clus_InnerPhi_Offset)) > 0.6 ) { continue; }
2084 
2085 //     //             int id_outer_big_r   = ( get_radius(outer_clu_phi_map[id_outer[0]][id_outer[1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[0]][id_outer[1]].second.y - beam_origin.second) > get_radius(outer_clu_phi_map[id_outer[2]][id_outer[3]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[2]][id_outer[3]].second.y - beam_origin.second) ) ? 0 : 2;
2086 
2087 //     //             pair<double,double> z_range_info = Get_possible_zvtx( 
2088 //     //                 0., // get_radius(beam_origin.first,beam_origin.second), 
2089 //     //                 {get_radius(inner_clu_phi_map[true_scan_i][inner_i].second.x - beam_origin.first, inner_clu_phi_map[true_scan_i][inner_i].second.y - beam_origin.second), inner_clu_phi_map[true_scan_i][inner_i].second.z}, // note : unsign radius
2090 //     //                 {get_radius(outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.x - beam_origin.first, outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.y - beam_origin.second), outer_clu_phi_map[id_outer[id_outer_big_r]][id_outer[id_outer_big_r+1]].second.z}  // note : unsign radius
2091 //     //             );
2092 
2093 //     //             // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
2094 //     //             if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
2095 
2096 //     //             cluster3_all_track_phi_1D   -> Fill(get_track_phi(Clus_InnerPhi_Offset, get_delta_phi(Clus_InnerPhi_Offset, Mega_outer_clu_phi[ind_outer_mega[outer_i]])));
2097 //     //             cluster3_outer_track_phi_1D -> Fill(get_track_phi(Clus_InnerPhi_Offset, get_delta_phi(Clus_InnerPhi_Offset, Mega_outer_clu_phi[ind_outer_mega[outer_i]])));
2098 
2099 //     //             NClu3_track_count += 1;
2100 
2101 //     //             // note : to mark the cluster as used 
2102 //     //             outer_used_mega_clu[Form("%i_%i", id_outer[0], id_outer[1])] += 1;
2103 //     //             outer_used_mega_clu[Form("%i_%i", id_outer[2], id_outer[3])] += 1;
2104 
2105 //     //             outer_clu_phi_map[id_outer[0]][id_outer[1]].first = true;
2106 //     //             outer_clu_phi_map[id_outer[2]][id_outer[3]].first = true;
2107 //     //             inner_clu_phi_map[true_scan_i][inner_i].first = true;
2108 //     //         }
2109 //     //     }
2110 //     // }
2111 
2112 //     // NClu4_track_centrality_2D -> Fill(centrality_map[centrality_bin], NClu4_track_count);
2113 //     // NClu3_track_centrality_2D -> Fill(centrality_map[centrality_bin], NClu3_track_count);
2114 
2115 //     // // note : for the mega cluster test only
2116 //     // return;
2117 
2118 //     // note : for two-cluster tracklets only
2119 //     for (int inner_phi_i = 0; inner_phi_i < 360; inner_phi_i++) // note : each phi cell (1 degree)
2120 //     {
2121 //         // note : N cluster in this phi cell
2122 //         for (int inner_phi_clu_i = 0; inner_phi_clu_i < inner_clu_phi_map[inner_phi_i].size(); inner_phi_clu_i++)
2123 //         {
2124 //             clu_multi_used_tight = 0;
2125 //             clu_multi_used_loose = 0;
2126 //             if (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].first == true) {continue;}
2127 
2128 //             Clus_InnerPhi_Offset = (inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
2129 
2130 //             // todo: change the outer phi scan range
2131 //             // note : the outer phi index, -4, -3, -2, -1, 0, 1, 2, 3, 4
2132 //             for (int scan_i = -4; scan_i < 5; scan_i++)
2133 //             {
2134 //                 int true_scan_i = ((inner_phi_i + scan_i) < 0) ? 360 + (inner_phi_i + scan_i) : ((inner_phi_i + scan_i) > 359) ? (inner_phi_i + scan_i)-360 : inner_phi_i + scan_i;
2135 
2136 //                 // note : N clusters in that outer phi cell
2137 //                 for (int outer_phi_clu_i = 0; outer_phi_clu_i < outer_clu_phi_map[true_scan_i].size(); outer_phi_clu_i++)
2138 //                 {
2139 //                     if (outer_clu_phi_map[true_scan_i][outer_phi_clu_i].first == true) {continue;}
2140 
2141 //                     Clus_OuterPhi_Offset = (outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second < 0) ? atan2(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi()) + 360 : atan2(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first) * (180./TMath::Pi());
2142 //                     double delta_phi = get_delta_phi(Clus_InnerPhi_Offset, Clus_OuterPhi_Offset);
2143                     
2144 //                     // if (fabs(delta_phi) > 5.72) {continue;}
2145 //                     if (fabs(delta_phi) > 3.5) {continue;}
2146 
2147 //                     double inner_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z});
2148 //                     double outer_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z});
2149 //                     double delta_eta = inner_clu_eta - outer_clu_eta;
2150 
2151 //                     track_delta_eta_1D[centrality_map[centrality_bin]] -> Fill( delta_eta );
2152 //                     track_delta_eta_1D[track_delta_eta_1D.size() - 1]  -> Fill( delta_eta );
2153 
2154 //                     track_DeltaPhi_DeltaEta_2D[centrality_map[centrality_bin]]        -> Fill(delta_phi, delta_eta);
2155 //                     track_DeltaPhi_DeltaEta_2D[track_DeltaPhi_DeltaEta_2D.size() - 1] -> Fill(delta_phi, delta_eta);
2156 
2157 //                     pair<double,double> z_range_info = Get_possible_zvtx( 
2158 //                         0., // get_radius(beam_origin.first,beam_origin.second), 
2159 //                         {get_radius(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second), inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z}, // note : unsign radius
2160 //                         {get_radius(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second), outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z}  // note : unsign radius
2161 //                     );
2162 
2163 //                     // note : this is a cut to constraint on the z vertex, only if the tracklets with the range that covers the z vertex can pass this cut
2164 //                     if (z_range_info.first - z_range_info.second > evt_z.first + evt_z.second || z_range_info.first + z_range_info.second < evt_z.first - evt_z.second) {continue;}
2165 //                     if (fabs(delta_phi) < 0.6) {clu_multi_used_tight += 1;}
2166 //                     track_delta_eta_1D_post[centrality_map[centrality_bin]]     -> Fill( delta_eta );
2167 //                     track_delta_eta_1D_post[track_delta_eta_1D_post.size() - 1] -> Fill( delta_eta );
2168 
2169 //                     double DCA_sign = calculateAngleBetweenVectors(
2170 //                         outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y,
2171 //                         inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y,
2172 //                         beam_origin.first, beam_origin.second
2173 //                     );
2174                     
2175 //                     track_DCA_distance[centrality_map[centrality_bin]] -> Fill( DCA_sign );
2176 //                     track_DCA_distance[track_DCA_distance.size() - 1]  -> Fill( DCA_sign ); 
2177 
2178 //                     track_phi_DCA_2D[centrality_map[centrality_bin]] -> Fill( delta_phi, DCA_sign );
2179 //                     track_phi_DCA_2D[track_phi_DCA_2D.size() - 1]    -> Fill( delta_phi, DCA_sign );
2180                     
2181 //                     track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( delta_phi );
2182 //                     track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( delta_phi );
2183 
2184 //                     proto_pair_index.push_back({inner_phi_i, inner_phi_clu_i, true_scan_i, outer_phi_clu_i});
2185 //                     proto_pair_delta_phi_abs.push_back(fabs(delta_phi));
2186 //                     proto_pair_delta_phi.push_back({Clus_InnerPhi_Offset, Clus_OuterPhi_Offset, delta_phi});
2187 
2188 
2189 //                     // note : do the fill here (find the best match outer cluster with the inner cluster )
2190 //                     Get_eta_pair = Get_eta(
2191 //                         {0., evt_z.first,evt_z.second},
2192 //                         {get_radius(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second), inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z},
2193 //                         {get_radius(outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x - beam_origin.first, outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y - beam_origin.second), outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z}
2194 //                     );
2195                     
2196 //                     if  (Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2. > 0.3)
2197 //                     {
2198 //                         cout<<" "<<endl;
2199 //                         cout<<"inner clu eta : "<<inner_clu_eta<<" outer clu eta : "<<outer_clu_eta<<"avg eta : "<< (inner_clu_eta + outer_clu_eta)/2. <<" reco eta : "<<Get_eta_pair.second<<" diff: "<<Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.<<endl;
2200 //                         cout<<"inner clu pos : "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x<<" "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y<<" "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z<<endl;
2201 //                         cout<<"outer clu pos : "<<outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.x<<" "<<outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.y<<" "<<outer_clu_phi_map[true_scan_i][outer_phi_clu_i].second.z<<endl;
2202 //                     }  
2203 
2204 
2205 //                     double track_phi = get_track_phi(Clus_InnerPhi_Offset, delta_phi);
2206 
2207 //                     reco_eta_correlation_2D -> Fill(Get_eta_pair.second, (inner_clu_eta + outer_clu_eta)/2.);
2208 //                     reco_eta_diff_reco3P_2D -> Fill(Get_eta_pair.second, Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
2209 //                     reco_eta_diff_1D        -> Fill(Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
2210 
2211 //                     // track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( delta_phi );
2212 //                     // track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( delta_phi );
2213 
2214 //                     track_DeltaPhi_eta_2D[centrality_map[centrality_bin]]   -> Fill(delta_phi, Get_eta_pair.second);
2215 //                     track_DeltaPhi_eta_2D[track_DeltaPhi_eta_2D.size() - 1] -> Fill(delta_phi, Get_eta_pair.second);
2216 
2217 //                     if (fabs(delta_phi) <= 1)
2218 //                     {
2219 //                         dNdeta_1D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second);
2220 //                         dNdeta_1D[dNdeta_1D.size() - 1]           -> Fill(Get_eta_pair.second);
2221 
2222 //                         track_eta_z_2D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second, evt_z.first);
2223 //                         track_eta_z_2D[track_eta_z_2D.size() - 1]      -> Fill(Get_eta_pair.second, evt_z.first);
2224 
2225 //                         evt_NTrack += 1;
2226 //                     }
2227                     
2228 //                     track_eta_phi_2D[centrality_map[centrality_bin]] -> Fill(track_phi, Get_eta_pair.second);
2229 //                     track_eta_phi_2D[track_eta_phi_2D.size() - 1]    -> Fill(track_phi, Get_eta_pair.second);
2230                     
2231 //                     // note : find the bin of the eta
2232 //                     double eta_bin = eta_region_hist -> Fill(Get_eta_pair.second);
2233 //                     // cout<<"test1 "<<eta_bin<<endl;
2234 //                     if (eta_bin != -1)
2235 //                     {
2236 //                         final_track_delta_phi_1D[centrality_map[centrality_bin]][eta_bin - 1]      -> Fill(delta_phi);
2237 //                         final_track_delta_phi_1D[final_track_delta_phi_1D.size() - 1][eta_bin - 1] -> Fill(delta_phi);
2238 
2239 //                         // todo : the signal region selection
2240 //                         if (fabs(delta_phi) <= 1) { 
2241 //                             good_tracklet_counting[centrality_map[centrality_bin]][eta_bin - 1] += 1;
2242 //                             good_tracklet_counting[final_track_delta_phi_1D.size() - 1][eta_bin - 1] += 1;
2243 //                         }
2244 
2245 //                         out_track_delta_phi_d.push_back(delta_phi);
2246 //                         out_track_eta_d.push_back(Get_eta_pair.second);
2247 //                         out_track_eta_i.push_back(eta_bin);
2248 //                     }
2249 //                 }
2250 //             } // note : end outer loop
2251 
2252 //             clu_used_centrality_2D -> Fill(total_NClus, clu_multi_used_tight);
2253 
2254 //             // // note : if there is no good match with inner and outer clusters, continue
2255 //             // if (clu_multi_used_loose == 0) {continue;}
2256 
2257 //             // // note : do the fill here (find the best match outer cluster with the inner cluster )
2258 //             // Get_eta_pair = Get_eta(
2259 //             //     {0., evt_z.first,evt_z.second},
2260 //             //     {get_radius(inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x - beam_origin.first, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y - beam_origin.second), inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z},
2261 //             //     {get_radius(outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.x - beam_origin.first, outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.y - beam_origin.second), outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.z}
2262 //             // );
2263 
2264 //             // double inner_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y, inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z});
2265 //             // double outer_clu_eta = get_clu_eta({beam_origin.first, beam_origin.second, evt_z.first},{outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.x, outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.y, outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.z});
2266 //             // double track_phi = Clus_InnerPhi_Offset - (pair_delta_phi/2.);
2267 
2268 //             // if  (Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2. > 0.3)
2269 //             // {
2270 //             //     cout<<" "<<endl;
2271 //             //     cout<<"inner clu eta : "<<inner_clu_eta<<" outer clu eta : "<<outer_clu_eta<<"avg eta : "<< (inner_clu_eta + outer_clu_eta)/2. <<" reco eta : "<<Get_eta_pair.second<<" diff: "<<Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.<<endl;
2272 //             //     cout<<"inner clu pos : "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.x<<" "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.y<<" "<<inner_clu_phi_map[inner_phi_i][inner_phi_clu_i].second.z<<endl;
2273 //             //     cout<<"outer clu pos : "<<outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.x<<" "<<outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.y<<" "<<outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].second.z<<endl;
2274 //             // }
2275 
2276 //             // reco_eta_correlation_2D -> Fill(Get_eta_pair.second, (inner_clu_eta + outer_clu_eta)/2.);
2277 //             // reco_eta_diff_reco3P_2D -> Fill(Get_eta_pair.second, Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
2278 //             // reco_eta_diff_1D        -> Fill(Get_eta_pair.second - (inner_clu_eta + outer_clu_eta)/2.);
2279 
2280 //             // // track_delta_phi_1D[centrality_map[centrality_bin]] -> Fill( pair_delta_phi );
2281 //             // // track_delta_phi_1D[track_delta_phi_1D.size() - 1]  -> Fill( pair_delta_phi );
2282 
2283 //             // track_DeltaPhi_eta_2D[centrality_map[centrality_bin]]   -> Fill(pair_delta_phi, Get_eta_pair.second);
2284 //             // track_DeltaPhi_eta_2D[track_DeltaPhi_eta_2D.size() - 1] -> Fill(pair_delta_phi, Get_eta_pair.second);
2285 
2286 //             // // cout<<"test_5"<<endl;
2287 //             // dNdeta_1D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second);
2288 //             // dNdeta_1D[dNdeta_1D.size() - 1]           -> Fill(Get_eta_pair.second);
2289 
2290 //             // track_eta_phi_2D[centrality_map[centrality_bin]] -> Fill(track_phi, Get_eta_pair.second);
2291 //             // track_eta_phi_2D[track_eta_phi_2D.size() - 1]    -> Fill(track_phi, Get_eta_pair.second);
2292             
2293 //             // track_eta_z_2D[centrality_map[centrality_bin]] -> Fill(Get_eta_pair.second, evt_z.first);
2294 //             // track_eta_z_2D[track_eta_z_2D.size() - 1]      -> Fill(Get_eta_pair.second, evt_z.first);        
2295 
2296 //             // // note : find the bin of the eta
2297 //             // double eta_bin = eta_region_hist -> Fill(Get_eta_pair.second);
2298 //             // // cout<<"test1 "<<eta_bin<<endl;
2299 //             // if (eta_bin != -1)
2300 //             // {
2301 //             //     final_track_delta_phi_1D[centrality_map[centrality_bin]][eta_bin - 1]      -> Fill(pair_delta_phi);
2302 //             //     final_track_delta_phi_1D[final_track_delta_phi_1D.size() - 1][eta_bin - 1] -> Fill(pair_delta_phi);
2303 
2304 //             //     out_track_delta_phi_d.push_back(pair_delta_phi);
2305 //             //     out_track_eta_d.push_back(Get_eta_pair.second);
2306 //             //     out_track_eta_i.push_back(eta_bin);
2307 //             // }
2308 
2309 //             // evt_NTrack += 1;
2310 //             // // note : this outer cluster is used 
2311 //             // outer_clu_phi_map[pair_outer_index.first][pair_outer_index.second].first = true;
2312 //         }
2313 //     } // note : end inner loop
2314 
2315 //     out_eID = event_i;
2316 //     out_evt_centrality_bin = centrality_bin;
2317 //     out_evt_zvtx = evt_z.first;
2318 //     tree_out -> Fill();
2319 
2320 //     // cout<<" "<<endl;
2321 //     // cout<<" "<<endl;
2322 //     // cout<<"test_8"<<endl;
2323 //     if (run_type == "MC")
2324 //     {
2325 //         track_correlation_2D -> Fill(evt_NTrack_MC, evt_NTrack);
2326 //         track_ratio_1D[centrality_map[centrality_bin]] -> Fill( double(evt_NTrack) / double(evt_NTrack_MC) );
2327 //         track_ratio_1D[track_ratio_1D.size() - 1]      -> Fill( double(evt_NTrack) / double(evt_NTrack_MC) );
2328 //     }
2329         
2330 //     track_cluster_ratio_multiplicity_2D -> Fill( effective_total_NClus, double(effective_total_NClus) / double(evt_NTrack) );
2331 //     track_cluster_ratio_1D[centrality_map[centrality_bin]]    -> Fill( double(effective_total_NClus) / double(evt_NTrack) );
2332 //     track_cluster_ratio_1D[track_cluster_ratio_1D.size() - 1] -> Fill( double(effective_total_NClus) / double(evt_NTrack) );
2333 
2334 //     // if (run_type == "MC" && evt_NTrack_MC < draw_evt_cut && event_i % print_plot_ratio == 0){print_evt_plot(event_i, evt_NTrack_MC, inner_NClu, outer_NClu);}
2335 //     return_tag = 1;
2336 // }
2337 
2338 void INTTEta::ClearEvt()
2339 {
2340     if (evt_reco_track_gr_All -> GetN() != 0) {evt_reco_track_gr_All -> Set(0);}
2341     if (evt_reco_track_gr_PhiLoose -> GetN() != 0) {evt_reco_track_gr_PhiLoose -> Set(0);}
2342     if (evt_reco_track_gr_Z -> GetN() != 0) {evt_reco_track_gr_Z -> Set(0);}
2343     if (evt_reco_track_gr_ZDCA -> GetN() != 0) {evt_reco_track_gr_ZDCA -> Set(0);}
2344     if (evt_reco_track_gr_ZDCAPhi -> GetN() != 0) {evt_reco_track_gr_ZDCAPhi -> Set(0);}
2345     if (evt_true_track_gr -> GetN() != 0) {evt_true_track_gr -> Set(0);}
2346     if (track_gr -> GetN() != 0) {track_gr -> Set(0);}
2347 
2348     out_track_eta_d.clear();
2349     out_track_eta_i.clear();
2350     out_track_delta_phi_d.clear();
2351 
2352     Mega_inner_clu_pair_index.clear();
2353     Mega_inner_clu_delta_phi_abs.clear();
2354     Mega_inner_clu_phi.clear();
2355     Mega_outer_clu_pair_index.clear();
2356     Mega_outer_clu_delta_phi_abs.clear();
2357     Mega_outer_clu_phi.clear();
2358 
2359     clu4_mega_pair_index.clear();
2360     clu4_mega_pair_delta_phi_abs.clear();
2361     clu3_inner_mega_pair_index.clear();
2362     clu3_inner_mega_pair_delta_phi_abs.clear();
2363     clu3_outer_mega_pair_index.clear();
2364     clu3_outer_mega_pair_delta_phi_abs.clear();
2365 
2366     inner_used_mega_clu.clear();
2367     outer_used_mega_clu.clear();
2368 
2369     NClu3_track_count = 0;
2370     NClu4_track_count = 0;
2371     effective_total_NClus = 0;
2372 
2373     // for (int i = 0; i < 360; i++)
2374     // {
2375     //     inner_clu_phi_map[i].clear();
2376     //     outer_clu_phi_map[i].clear();
2377     // }
2378 
2379     std::fill(std::begin(inner_clu_phi_map), std::end(inner_clu_phi_map), std::vector<pair<bool,clu_info>>());
2380     std::fill(std::begin(outer_clu_phi_map), std::end(outer_clu_phi_map), std::vector<pair<bool,clu_info>>());
2381     proto_pair_index.clear();
2382     proto_pair_delta_phi_abs.clear();
2383     proto_pair_delta_phi.clear();
2384     inner_used_clu.clear();
2385     outer_used_clu.clear();
2386 
2387     return_tag = 0;
2388     evt_NTrack = 0;
2389     evt_NTrack_MC = 0;
2390     return;
2391 }
2392 
2393 double INTTEta::get_dist_offset(TH1F * hist_in, int check_N_bin) // note : check_N_bin 1 to N bins of hist
2394 {
2395     if (check_N_bin < 0 || check_N_bin > hist_in -> GetNbinsX()) {cout<<" wrong check_N_bin "<<endl; exit(1);}
2396     double total_entry = 0;
2397     for (int i = 0; i < check_N_bin; i++)
2398     {
2399         total_entry += hist_in -> GetBinContent(i+1); // note : 1, 2, 3.....
2400         total_entry += hist_in -> GetBinContent(hist_in -> GetNbinsX() - i);
2401     }
2402 
2403     return total_entry/double(2. * check_N_bin);
2404 }
2405 
2406 void INTTEta::PrintPlots()
2407 {
2408     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2409     c1 -> cd();
2410     c1 -> Print( Form("%s/track_cluster_ratio_1D.pdf(", out_folder_directory.c_str()) );
2411     c1 -> Clear();
2412     for (int i = 0; i < track_cluster_ratio_1D.size(); i++)
2413     {
2414         c1 -> cd();
2415         track_cluster_ratio_1D[i] -> Draw("hist");
2416         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2417         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2418         c1 -> Print(Form("%s/track_cluster_ratio_1D.pdf", out_folder_directory.c_str()));
2419         c1 -> Clear();    
2420     }
2421     c1 -> Print( Form("%s/track_cluster_ratio_1D.pdf)", out_folder_directory.c_str()) );
2422 
2423     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2424     c1 -> cd();
2425     c1 -> Print( Form("%s/track_cluster_ratio_1D_MC.pdf(", out_folder_directory.c_str()) );
2426     c1 -> Clear();
2427     for (int i = 0; i < track_cluster_ratio_1D_MC.size(); i++)
2428     {
2429         c1 -> cd();
2430         track_cluster_ratio_1D_MC[i] -> Draw("hist");
2431         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2432         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2433         c1 -> Print(Form("%s/track_cluster_ratio_1D_MC.pdf", out_folder_directory.c_str()));
2434         c1 -> Clear();    
2435     }
2436     c1 -> Print( Form("%s/track_cluster_ratio_1D_MC.pdf)", out_folder_directory.c_str()) );
2437 
2438     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2439     c1 -> Print( Form("%s/dNdeta_1D.pdf(", out_folder_directory.c_str()) );
2440     for (int i = 0; i < dNdeta_1D.size(); i++)
2441     {   
2442         double N_correction_evt = (i == dNdeta_1D_MC.size() - 1) ? N_GoodEvent : N_GoodEvent_vec[i];
2443         dNdeta_1D_MC[i] -> Scale(1./double(dNdeta_1D_MC[i] -> GetBinWidth(1) ));
2444         dNdeta_1D_MC[i] -> Scale(1./double(N_correction_evt));
2445         
2446         dNdeta_1D[i] -> Scale(1./double(dNdeta_1D[i] -> GetBinWidth(1) ));
2447         dNdeta_1D[i] -> Scale(1./double(N_correction_evt));
2448         dNdeta_1D[i] -> GetYaxis() -> SetRangeUser(0,800);
2449         dNdeta_1D[i] -> Draw("ep");
2450         dNdeta_1D_MC[i] -> Draw("hist same");
2451         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2452         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2453         c1 -> Print(Form("%s/dNdeta_1D.pdf", out_folder_directory.c_str()));
2454         c1 -> Clear();    
2455     }
2456     c1 -> Print( Form("%s/dNdeta_1D.pdf)", out_folder_directory.c_str()) );
2457 
2458     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2459     c1 -> Print( Form("%s/track_eta_phi_2D.pdf(", out_folder_directory.c_str()) );
2460     for (int i = 0; i < track_eta_phi_2D.size(); i++)
2461     {
2462         track_eta_phi_2D[i] -> Draw("colz0");
2463         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2464         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2465         c1 -> Print(Form("%s/track_eta_phi_2D.pdf", out_folder_directory.c_str()));
2466         c1 -> Clear();    
2467     }
2468     c1 -> Print( Form("%s/track_eta_phi_2D.pdf)", out_folder_directory.c_str()) );
2469 
2470     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2471     c1 -> Print( Form("%s/track_eta_z_2D.pdf(", out_folder_directory.c_str()) );
2472     for (int i = 0; i < track_eta_z_2D.size(); i++)
2473     {
2474         track_eta_z_2D[i] -> Draw("colz0");
2475         DrawEtaZGrid();
2476         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2477         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2478         c1 -> Print(Form("%s/track_eta_z_2D.pdf", out_folder_directory.c_str()));
2479         c1 -> Clear();    
2480     }
2481     c1 -> Print( Form("%s/track_eta_z_2D.pdf)", out_folder_directory.c_str()) );
2482 
2483     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2484     c1 -> Print( Form("%s/track_delta_phi_1D.pdf(", out_folder_directory.c_str()) );
2485     for (int i = 0; i < track_delta_phi_1D.size(); i++)
2486     {
2487         track_delta_phi_1D[i] -> SetMinimum(0);
2488         track_delta_phi_1D[i] -> Draw("hist");
2489         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2490         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2491         coord_line -> DrawLine(-1*phi_diff_cut, 0, -1 * phi_diff_cut, track_delta_phi_1D[i]->GetMaximum() * 1.1);
2492         coord_line -> DrawLine(phi_diff_cut, 0, phi_diff_cut, track_delta_phi_1D[i]->GetMaximum() * 1.1);
2493         c1 -> Print(Form("%s/track_delta_phi_1D.pdf", out_folder_directory.c_str()));
2494         c1 -> Clear();    
2495     }
2496     c1 -> Print( Form("%s/track_delta_phi_1D.pdf)", out_folder_directory.c_str()) );
2497 
2498     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2499     c1 -> Print( Form("%s/track_delta_eta_1D.pdf(", out_folder_directory.c_str()) );
2500     for (int i = 0; i < track_delta_eta_1D.size(); i++)
2501     {
2502         track_delta_eta_1D[i] -> SetMinimum(0);
2503         track_delta_eta_1D[i] -> Draw("hist");
2504         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2505         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2506         // coord_line -> DrawLine(-1*phi_diff_cut, 0, -1 * phi_diff_cut, track_delta_eta_1D[i]->GetMaximum() * 1.1);
2507         // coord_line -> DrawLine(phi_diff_cut, 0, phi_diff_cut, track_delta_eta_1D[i]->GetMaximum() * 1.1);
2508         c1 -> Print(Form("%s/track_delta_eta_1D.pdf", out_folder_directory.c_str()));
2509         c1 -> Clear();    
2510     }
2511     c1 -> Print( Form("%s/track_delta_eta_1D.pdf)", out_folder_directory.c_str()) );
2512 
2513     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2514     c1 -> Print( Form("%s/track_delta_eta_1D_post.pdf(", out_folder_directory.c_str()) );
2515     for (int i = 0; i < track_delta_eta_1D_post.size(); i++)
2516     {
2517         track_delta_eta_1D_post[i] -> SetMinimum(0);
2518         track_delta_eta_1D_post[i] -> Draw("hist");
2519         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2520         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2521         // coord_line -> DrawLine(-1*phi_diff_cut, 0, -1 * phi_diff_cut, track_delta_eta_1D_post[i]->GetMaximum() * 1.1);
2522         // coord_line -> DrawLine(phi_diff_cut, 0, phi_diff_cut, track_delta_eta_1D_post[i]->GetMaximum() * 1.1);
2523         c1 -> Print(Form("%s/track_delta_eta_1D_post.pdf", out_folder_directory.c_str()));
2524         c1 -> Clear();    
2525     }
2526     c1 -> Print( Form("%s/track_delta_eta_1D_post.pdf)", out_folder_directory.c_str()) );
2527 
2528     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2529     c1 -> Print( Form("%s/track_DCA_distance.pdf(", out_folder_directory.c_str()) );
2530     for (int i = 0; i < track_DCA_distance.size(); i++)
2531     {
2532         track_DCA_distance[i] -> SetMinimum(0);
2533         track_DCA_distance[i] -> Draw("hist");
2534         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2535         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2536         coord_line -> DrawLine(DCA_cut.first, 0, DCA_cut.first, track_DCA_distance[i]->GetMaximum() * 1.05);
2537         coord_line -> DrawLine(DCA_cut.second, 0, DCA_cut.second, track_DCA_distance[i]->GetMaximum() * 1.05);
2538         c1 -> Print(Form("%s/track_DCA_distance.pdf", out_folder_directory.c_str()));
2539         c1 -> Clear();    
2540     }
2541     c1 -> Print( Form("%s/track_DCA_distance.pdf)", out_folder_directory.c_str()) );
2542 
2543     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2544     c1 -> Print( Form("%s/track_phi_DCA_2D.pdf(", out_folder_directory.c_str()) );
2545     for (int i = 0; i < track_phi_DCA_2D.size(); i++)
2546     {
2547         track_phi_DCA_2D[i] -> Draw("colz0");
2548         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2549         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2550         
2551         coord_line -> DrawLine(track_phi_DCA_2D[i] -> GetXaxis() -> GetXmin(), DCA_cut.first, track_phi_DCA_2D[i] -> GetXaxis() -> GetXmax(), DCA_cut.first);
2552         coord_line -> DrawLine(track_phi_DCA_2D[i] -> GetXaxis() -> GetXmin(), DCA_cut.second, track_phi_DCA_2D[i] -> GetXaxis() -> GetXmax(), DCA_cut.second);
2553         coord_line -> DrawLine(-1 * phi_diff_cut, track_phi_DCA_2D[i] -> GetYaxis() -> GetXmin(), -1 * phi_diff_cut, track_phi_DCA_2D[i] -> GetYaxis() -> GetXmax());
2554         coord_line -> DrawLine(phi_diff_cut, track_phi_DCA_2D[i] -> GetYaxis() -> GetXmin(), phi_diff_cut, track_phi_DCA_2D[i] -> GetYaxis() -> GetXmax());
2555         c1 -> Print(Form("%s/track_phi_DCA_2D.pdf", out_folder_directory.c_str()));
2556         c1 -> Clear();    
2557     }
2558     c1 -> Print( Form("%s/track_phi_DCA_2D.pdf)", out_folder_directory.c_str()) );
2559 
2560     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2561     c1 -> Print( Form("%s/track_ratio_1D.pdf(", out_folder_directory.c_str()) );
2562     for (int i = 0; i < track_ratio_1D.size(); i++)
2563     {
2564         track_ratio_1D[i] -> SetMinimum(0);
2565         track_ratio_1D[i] -> Draw("hist");
2566         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2567         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2568         c1 -> Print(Form("%s/track_ratio_1D.pdf", out_folder_directory.c_str()));
2569         c1 -> Clear();    
2570     }
2571     c1 -> Print( Form("%s/track_ratio_1D.pdf)", out_folder_directory.c_str()) );
2572     
2573     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2574     for (int i = 0; i < final_track_delta_phi_1D.size(); i++)
2575     {
2576         c1 -> Print( Form("%s/final_track_delta_phi_1D_MBin%i.pdf(", out_folder_directory.c_str(), i) );
2577 
2578         for (int i1 = 0; i1 < final_track_delta_phi_1D[i].size(); i1++)
2579         {   
2580             double hist_offset = get_dist_offset(final_track_delta_phi_1D[i][i1], 15);
2581             gaus_pol1_fit->SetParameters( final_track_delta_phi_1D[i][i1] -> GetBinContent(final_track_delta_phi_1D[i][i1] -> GetMaximumBin()) - hist_offset, 0, final_track_delta_phi_1D[i][i1]->GetStdDev()/2., hist_offset, 0);
2582             final_track_delta_phi_1D[i][i1] -> Fit(gaus_pol1_fit,"NQ");
2583 
2584             // note : par[0] : size
2585             // note : par[1] : ratio of the two gaussians
2586             // note : par[2] : mean
2587             // note : par[3] : width of gaus 1
2588             // note : par[4] : width of gaus 2
2589             // note : par[5] : offset
2590             // note : par[6] : slope
2591             // note : fit with double gaussian function + pol1
2592             d_gaus_pol1_fit -> SetParameters(final_track_delta_phi_1D[i][i1] -> GetBinContent(final_track_delta_phi_1D[i][i1] -> GetMaximumBin()) - hist_offset, 0.2, 0, final_track_delta_phi_1D[i][i1]->GetStdDev()/2., final_track_delta_phi_1D[i][i1]->GetStdDev()/2., hist_offset, 0);
2593             d_gaus_pol1_fit -> SetParLimits(1, 0, 0.5);  // note : the first gaussian is  the main distribution, So it should contain more than 50% of the total distribution
2594             d_gaus_pol1_fit -> SetParLimits(3, 0, 1000); // note : the width of the gaussian should be positive
2595             d_gaus_pol1_fit -> SetParLimits(4, 0, 1000); // note : the width of the gaussian should be positive
2596             final_track_delta_phi_1D[i][i1] -> Fit(d_gaus_pol1_fit,"NQ");
2597             // note : extract the signal region
2598             draw_d_gaus -> SetParameters(d_gaus_pol1_fit->GetParameter(0), d_gaus_pol1_fit->GetParameter(1), d_gaus_pol1_fit->GetParameter(2), d_gaus_pol1_fit->GetParameter(3), d_gaus_pol1_fit->GetParameter(4));
2599             // note : extract the part of pol1 background
2600             draw_pol1_line -> SetParameters(d_gaus_pol1_fit -> GetParameter(5), d_gaus_pol1_fit -> GetParameter(6));
2601 
2602             // note : fit the background region only by the pol2 function
2603             // note : p[0] + p[1]*(x-p[3])+p[2] * (x-p[3])^2
2604             bkg_fit_pol2 -> SetParameters(hist_offset,0,-0.2,0,signal_region);
2605             bkg_fit_pol2 -> FixParameter(4,signal_region);
2606             bkg_fit_pol2 -> SetParLimits(2, -100, 0);
2607             final_track_delta_phi_1D[i][i1] -> Fit(bkg_fit_pol2,"NQ");
2608             // note : extract the background region (which includes the signal region also)
2609             draw_pol2_line -> SetParameters(bkg_fit_pol2 -> GetParameter(0), bkg_fit_pol2 -> GetParameter(1), bkg_fit_pol2 -> GetParameter(2), bkg_fit_pol2 -> GetParameter(3));
2610 
2611             final_track_delta_phi_1D[i][i1] -> SetMinimum(0);
2612             final_track_delta_phi_1D[i][i1] -> SetMaximum( final_track_delta_phi_1D[i][i1] -> GetBinContent(final_track_delta_phi_1D[i][i1] -> GetMaximumBin()) * 1.5);
2613             final_track_delta_phi_1D[i][i1] -> Draw("hist"); 
2614             // d_gaus_pol1_fit -> Draw("lsame");
2615             // draw_d_gaus -> Draw("lsame");
2616             // draw_pol1_line -> Draw("lsame");
2617             draw_pol2_line -> Draw("lsame");
2618 
2619             // gaus_pol1_fit -> Draw("lsame");
2620             // draw_gaus_line -> SetParameters(fabs(gaus_pol1_fit -> GetParameter(0)), gaus_pol1_fit -> GetParameter(1), fabs(gaus_pol1_fit -> GetParameter(2)), 0);
2621             // draw_gaus_line -> Draw("lsame");
2622             // draw_pol1_line -> SetParameters(gaus_pol1_fit -> GetParameter(3), gaus_pol1_fit -> GetParameter(4));
2623             // draw_pol1_line -> Draw("lsame");
2624 
2625             cout<<" "<<endl;
2626             // final_eta_entry[i].push_back((draw_gaus_line -> GetParameter(1) - 3 * draw_gaus_line -> GetParameter(2)), draw_gaus_line -> GetParameter(1) + 3 * draw_gaus_line -> GetParameter(2));
2627             // cout<<i<<" "<<i1<<" gaus fit par  : "<<fabs(gaus_pol1_fit -> GetParameter(0))<<" "<<(gaus_pol1_fit -> GetParameter(1))<<" "<<fabs(gaus_pol1_fit -> GetParameter(2))<<endl;
2628             double gaus_integral = fabs(draw_gaus_line -> Integral( (draw_gaus_line -> GetParameter(1) - 3 * fabs(draw_gaus_line -> GetParameter(2))), draw_gaus_line -> GetParameter(1) + 3 * fabs(draw_gaus_line -> GetParameter(2)) )) / final_track_delta_phi_1D[i][i1] -> GetBinWidth(1);
2629             cout<<i<<" "<<i1<<" gaus integral : "<< gaus_integral <<endl;
2630 
2631             double d_gaus_integral = fabs(draw_d_gaus -> Integral( -1 * signal_region, signal_region )) / final_track_delta_phi_1D[i][i1] -> GetBinWidth(1);
2632             cout<<i<<" "<<i1<<" D-gaus integral : "<< d_gaus_integral <<endl;
2633             
2634             double pol2_bkg_integral = fabs(draw_pol2_line -> Integral( -1 * signal_region, signal_region )) / final_track_delta_phi_1D[i][i1] -> GetBinWidth(1);
2635             cout<<i<<" "<<i1<<" pol2_bkg integral: "<<pol2_bkg_integral<<endl;
2636 
2637             // final_dNdeta_1D[i]->SetBinContent(i1 + 1, good_tracklet_counting[i][i1] - pol2_bkg_integral );
2638             if (eta_z_convert_inverse_map[i1].second == tight_zvtx_bin) { final_dNdeta_1D[i]->SetBinContent(i1 + 1, good_tracklet_counting[i][i1] ); } // note : no background subtraction
2639 
2640             coord_line -> DrawLine(-1*signal_region, 0, -1 * signal_region, final_track_delta_phi_1D[i][i1] -> GetBinContent(final_track_delta_phi_1D[i][i1] -> GetMaximumBin()) * 1.5);
2641             coord_line -> DrawLine(signal_region, 0, signal_region, final_track_delta_phi_1D[i][i1] -> GetBinContent(final_track_delta_phi_1D[i][i1] -> GetMaximumBin()) * 1.5);
2642             
2643             ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2644             draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s, #eta: %.2f - %.2f",centrality_region[i].c_str(), eta_region_hist -> GetBinCenter(i1+1) - eta_region_hist -> GetBinWidth(i1+1)/2., eta_region_hist -> GetBinCenter(i1+1) + eta_region_hist -> GetBinWidth(i1+1)/2.));
2645             draw_text -> DrawLatex(0.21, 0.85, Form("Guassian integral : %.2f", gaus_integral));
2646             draw_text -> DrawLatex(0.21, 0.80, Form("D-Guassian integral : %.2f", d_gaus_integral));
2647             draw_text -> DrawLatex(0.21, 0.75, Form("pol2: %.2f + %.2f(x-%.2f) + %.2f(x-%.2f)^{2}", bkg_fit_pol2 -> GetParameter(0), bkg_fit_pol2 -> GetParameter(1), bkg_fit_pol2 -> GetParameter(3), bkg_fit_pol2 -> GetParameter(2), bkg_fit_pol2 -> GetParameter(3)));
2648             c1 -> Print( Form("%s/final_track_delta_phi_1D_MBin%i.pdf", out_folder_directory.c_str(), i) );
2649             c1 -> Clear();
2650         }
2651 
2652         c1 -> Print( Form("%s/final_track_delta_phi_1D_MBin%i.pdf)", out_folder_directory.c_str(), i) );
2653     }
2654 
2655     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2656     
2657     for (int i = 0; i < final_track_multi_delta_phi_1D.size(); i++)
2658     {
2659         c1 -> Print( Form("%s/final_track_multi_delta_phi_1D_MBin%i.pdf(", out_folder_directory.c_str(), i) );
2660 
2661         for (int i1 = 0; i1 < final_track_multi_delta_phi_1D[i].size(); i1++)
2662         {   
2663             double hist_offset = get_dist_offset(final_track_multi_delta_phi_1D[i][i1], 15);
2664             gaus_pol1_fit->SetParameters( final_track_multi_delta_phi_1D[i][i1] -> GetBinContent(final_track_multi_delta_phi_1D[i][i1] -> GetMaximumBin()) - hist_offset, 0, final_track_multi_delta_phi_1D[i][i1]->GetStdDev()/2., hist_offset, 0);
2665             final_track_multi_delta_phi_1D[i][i1] -> Fit(gaus_pol1_fit,"NQ");
2666 
2667             // note : par[0] : size
2668             // note : par[1] : ratio of the two gaussians
2669             // note : par[2] : mean
2670             // note : par[3] : width of gaus 1
2671             // note : par[4] : width of gaus 2
2672             // note : par[5] : offset
2673             // note : par[6] : slope
2674             // note : fit with double gaussian function + pol1
2675             d_gaus_pol1_fit -> SetParameters(final_track_multi_delta_phi_1D[i][i1] -> GetBinContent(final_track_multi_delta_phi_1D[i][i1] -> GetMaximumBin()) - hist_offset, 0.2, 0, final_track_multi_delta_phi_1D[i][i1]->GetStdDev()/2., final_track_multi_delta_phi_1D[i][i1]->GetStdDev()/2., hist_offset, 0);
2676             d_gaus_pol1_fit -> SetParLimits(1, 0, 0.5);  // note : the first gaussian is  the main distribution, So it should contain more than 50% of the total distribution
2677             d_gaus_pol1_fit -> SetParLimits(3, 0, 1000); // note : the width of the gaussian should be positive
2678             d_gaus_pol1_fit -> SetParLimits(4, 0, 1000); // note : the width of the gaussian should be positive
2679             final_track_multi_delta_phi_1D[i][i1] -> Fit(d_gaus_pol1_fit,"NQ");
2680             // note : extract the signal region
2681             draw_d_gaus -> SetParameters(d_gaus_pol1_fit->GetParameter(0), d_gaus_pol1_fit->GetParameter(1), d_gaus_pol1_fit->GetParameter(2), d_gaus_pol1_fit->GetParameter(3), d_gaus_pol1_fit->GetParameter(4));
2682             // note : extract the part of pol1 background
2683             draw_pol1_line -> SetParameters(d_gaus_pol1_fit -> GetParameter(5), d_gaus_pol1_fit -> GetParameter(6));
2684 
2685             // note : fit the background region only by the pol2 function
2686             // note : p[0] + p[1]*(x-p[3])+p[2] * (x-p[3])^2
2687             bkg_fit_pol2 -> SetParameters(hist_offset,0,-0.2,0,signal_region);
2688             bkg_fit_pol2 -> FixParameter(4,signal_region);
2689             final_track_multi_delta_phi_1D[i][i1] -> Fit(bkg_fit_pol2,"NQ");
2690             // note : extract the background region (which includes the signal region also)
2691             draw_pol2_line -> SetParameters(bkg_fit_pol2 -> GetParameter(0), bkg_fit_pol2 -> GetParameter(1), bkg_fit_pol2 -> GetParameter(2), bkg_fit_pol2 -> GetParameter(3));
2692 
2693             final_track_multi_delta_phi_1D[i][i1] -> SetMinimum(0);
2694             final_track_multi_delta_phi_1D[i][i1] -> SetMaximum( final_track_multi_delta_phi_1D[i][i1] -> GetBinContent(final_track_multi_delta_phi_1D[i][i1] -> GetMaximumBin()) * 1.5);
2695             final_track_multi_delta_phi_1D[i][i1] -> Draw("hist"); 
2696             // d_gaus_pol1_fit -> Draw("lsame");
2697             // draw_d_gaus -> Draw("lsame");
2698             // draw_pol1_line -> Draw("lsame");
2699             draw_pol2_line -> Draw("lsame");
2700 
2701             // gaus_pol1_fit -> Draw("lsame");
2702             // draw_gaus_line -> SetParameters(fabs(gaus_pol1_fit -> GetParameter(0)), gaus_pol1_fit -> GetParameter(1), fabs(gaus_pol1_fit -> GetParameter(2)), 0);
2703             // draw_gaus_line -> Draw("lsame");
2704             // draw_pol1_line -> SetParameters(gaus_pol1_fit -> GetParameter(3), gaus_pol1_fit -> GetParameter(4));
2705             // draw_pol1_line -> Draw("lsame");
2706 
2707             cout<<" "<<endl;
2708             // final_eta_entry[i].push_back((draw_gaus_line -> GetParameter(1) - 3 * draw_gaus_line -> GetParameter(2)), draw_gaus_line -> GetParameter(1) + 3 * draw_gaus_line -> GetParameter(2));
2709             // cout<<i<<" "<<i1<<" gaus fit par  : "<<fabs(gaus_pol1_fit -> GetParameter(0))<<" "<<(gaus_pol1_fit -> GetParameter(1))<<" "<<fabs(gaus_pol1_fit -> GetParameter(2))<<endl;
2710             double gaus_integral = fabs(draw_gaus_line -> Integral( (draw_gaus_line -> GetParameter(1) - 3 * fabs(draw_gaus_line -> GetParameter(2))), draw_gaus_line -> GetParameter(1) + 3 * fabs(draw_gaus_line -> GetParameter(2)) )) / final_track_multi_delta_phi_1D[i][i1] -> GetBinWidth(1);
2711             // cout<<i<<" "<<i1<<" gaus integral : "<< gaus_integral <<endl;
2712 
2713             double d_gaus_integral = fabs(draw_d_gaus -> Integral( -1 * signal_region, signal_region )) / final_track_multi_delta_phi_1D[i][i1] -> GetBinWidth(1);
2714             // cout<<i<<" "<<i1<<" D-gaus integral : "<< d_gaus_integral <<endl;
2715             
2716             double pol2_bkg_integral = fabs(draw_pol2_line -> Integral( -1 * signal_region, signal_region )) / final_track_multi_delta_phi_1D[i][i1] -> GetBinWidth(1);
2717             cout<<i<<" "<<i1<<" pol2_bkg integral: "<<pol2_bkg_integral<<endl;
2718 
2719             if (eta_z_convert_inverse_map[i1].second == tight_zvtx_bin) { final_dNdeta_multi_1D[i]->SetBinContent(i1 + 1, good_tracklet_multi_counting[i][i1] - pol2_bkg_integral ); }
2720 
2721             coord_line -> DrawLine(-1*signal_region, 0, -1 * signal_region, final_track_multi_delta_phi_1D[i][i1] -> GetBinContent(final_track_multi_delta_phi_1D[i][i1] -> GetMaximumBin()) * 1.5);
2722             coord_line -> DrawLine(signal_region, 0, signal_region, final_track_multi_delta_phi_1D[i][i1] -> GetBinContent(final_track_multi_delta_phi_1D[i][i1] -> GetMaximumBin()) * 1.5);
2723             
2724             ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2725             draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s, #eta: %.2f - %.2f",centrality_region[i].c_str(), eta_region_hist -> GetBinCenter(i1+1) - eta_region_hist -> GetBinWidth(i1+1)/2., eta_region_hist -> GetBinCenter(i1+1) + eta_region_hist -> GetBinWidth(i1+1)/2.));
2726             // draw_text -> DrawLatex(0.21, 0.85, Form("Guassian integral : %.2f", gaus_integral));
2727             // draw_text -> DrawLatex(0.21, 0.80, Form("D-Guassian integral : %.2f", d_gaus_integral));
2728             draw_text -> DrawLatex(0.21, 0.85, Form("pol2: %.2f + %.2f(x-%.2f) + %.2f(x-%.2f)^{2}", bkg_fit_pol2 -> GetParameter(0), bkg_fit_pol2 -> GetParameter(1), bkg_fit_pol2 -> GetParameter(3), bkg_fit_pol2 -> GetParameter(2), bkg_fit_pol2 -> GetParameter(3)));
2729             c1 -> Print( Form("%s/final_track_multi_delta_phi_1D_MBin%i.pdf", out_folder_directory.c_str(), i) );
2730             c1 -> Clear();
2731         }
2732 
2733         c1 -> Print( Form("%s/final_track_multi_delta_phi_1D_MBin%i.pdf)", out_folder_directory.c_str(), i) );
2734     }
2735     
2736 
2737     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2738     c1 -> Print( Form("%s/final_dNdeta_1D.pdf(", out_folder_directory.c_str()) );
2739     for (int i = 0; i < final_dNdeta_1D.size(); i++)
2740     {   
2741         double N_correction_evt = (i == final_dNdeta_1D_MC.size() - 1) ? MBin_Z_hist_2D -> GetBinContent(MBin_Z_hist_2D -> GetNbinsX(),tight_zvtx_bin) : MBin_Z_hist_2D -> GetBinContent(i+1,tight_zvtx_bin);
2742         final_dNdeta_1D_MC[i] -> Scale(1./double(final_dNdeta_1D_MC[i] -> GetBinWidth(1) ));
2743         final_dNdeta_1D_MC[i] -> Scale(1./double(N_correction_evt));
2744         
2745         final_dNdeta_1D[i] -> Scale(1./double(final_dNdeta_1D[i] -> GetBinWidth(1) ));
2746         final_dNdeta_1D[i] -> Scale(1./double(N_correction_evt));
2747         final_dNdeta_1D[i] -> GetYaxis() -> SetRangeUser(0, final_dNdeta_1D[i] -> GetMaximum() * 1.5);
2748 
2749         final_dNdeta_multi_1D[i] -> Scale(1./double(final_dNdeta_multi_1D[i] -> GetBinWidth(1) ));
2750         final_dNdeta_multi_1D[i] -> Scale(1./double(N_correction_evt));
2751 
2752         // final_dNdeta_1D[i] -> SetMinimum(0);
2753         final_dNdeta_1D[i] -> Draw("ep");
2754         final_dNdeta_1D_MC[i] -> Draw("hist same");
2755         final_dNdeta_multi_1D[i] -> Draw("ep same");
2756         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2757         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2758         c1 -> Print(Form("%s/final_dNdeta_1D.pdf", out_folder_directory.c_str()));
2759         c1 -> Clear();    
2760     }
2761     c1 -> Print( Form("%s/final_dNdeta_1D.pdf)", out_folder_directory.c_str()) );
2762 
2763     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2764     track_cluster_ratio_multiplicity_2D -> Draw("colz0");
2765     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2766     c1 -> Print( Form("%s/track_cluster_ratio_multiplicity_2D.pdf", out_folder_directory.c_str()) );
2767     c1 -> Clear();
2768 
2769     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2770     track_cluster_ratio_multiplicity_2D_MC -> Draw("colz0");
2771     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2772     c1 -> Print( Form("%s/track_cluster_ratio_multiplicity_2D_MC.pdf", out_folder_directory.c_str()) );
2773     c1 -> Clear();
2774 
2775     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2776     track_correlation_2D -> Draw("colz0");
2777     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2778     correlation_Line -> Draw("lsame");
2779     c1 -> Print( Form("%s/track_correlation_2D.pdf", out_folder_directory.c_str()) );
2780     c1 -> Clear();
2781 
2782     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2783     track_ratio_2D -> Draw("colz0");
2784     coord_line -> DrawLine( track_ratio_2D->GetXaxis()->GetXmin(), 1, track_ratio_2D->GetXaxis()->GetXmax(), 1 );
2785     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2786     c1 -> Print( Form("%s/track_ratio_2D.pdf", out_folder_directory.c_str()) );
2787     c1 -> Clear();
2788 
2789     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2790     reco_eta_correlation_2D -> Draw("colz0");
2791     correlation_Line -> Draw("lsame");
2792     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2793     c1 -> Print( Form("%s/reco_eta_correlation_2D.pdf", out_folder_directory.c_str()) );
2794     c1 -> Clear();
2795 
2796     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2797     reco_eta_diff_reco3P_2D -> Draw("colz0");
2798     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2799     c1 -> Print( Form("%s/reco_eta_diff_reco3P_2D.pdf", out_folder_directory.c_str()) );
2800     c1 -> Clear();
2801 
2802     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2803     reco_eta_diff_1D -> Draw("hist");
2804     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2805     c1 -> Print( Form("%s/reco_eta_diff_1D.pdf", out_folder_directory.c_str()) );
2806     c1 -> Clear();
2807 
2808     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2809     c1 -> Print( Form("%s/track_DeltaPhi_eta_2D.pdf(", out_folder_directory.c_str()) );
2810     for (int i = 0; i < track_DeltaPhi_eta_2D.size(); i++)
2811     {
2812         track_DeltaPhi_eta_2D[i] -> Draw("colz0");
2813         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2814         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2815         c1 -> Print(Form("%s/track_DeltaPhi_eta_2D.pdf", out_folder_directory.c_str()));
2816         c1 -> Clear();    
2817     }
2818     c1 -> Print( Form("%s/track_DeltaPhi_eta_2D.pdf)", out_folder_directory.c_str()) );
2819 
2820     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2821     c1 -> Print( Form("%s/track_DeltaPhi_DeltaEta_2D.pdf(", out_folder_directory.c_str()) );
2822     for (int i = 0; i < track_DeltaPhi_DeltaEta_2D.size(); i++)
2823     {
2824         track_DeltaPhi_DeltaEta_2D[i] -> Draw("colz0");
2825         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2826         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2827         c1 -> Print(Form("%s/track_DeltaPhi_DeltaEta_2D.pdf", out_folder_directory.c_str()));
2828         c1 -> Clear();    
2829     }
2830     c1 -> Print( Form("%s/track_DeltaPhi_DeltaEta_2D.pdf)", out_folder_directory.c_str()) );
2831 
2832     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2833     c1 -> Print( Form("%s/dNdeta_1D_MC.pdf(", out_folder_directory.c_str()) );
2834     for (int i = 0; i < dNdeta_1D_MC.size(); i++)
2835     {
2836         // dNdeta_1D_MC[i] -> Scale(1./double(dNdeta_1D_MC[i] -> GetBinWidth(1) ));
2837         // double N_correction_evt = (i == dNdeta_1D_MC.size() - 1) ? N_GoodEvent : N_GoodEvent_vec[i];
2838         // dNdeta_1D_MC[i] -> Scale(1./double(N_GoodEvent));
2839         dNdeta_1D_MC[i] -> GetYaxis() -> SetRangeUser(0,800);
2840         dNdeta_1D_MC[i] -> Draw("hist");
2841         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2842         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2843         c1 -> Print(Form("%s/dNdeta_1D_MC.pdf", out_folder_directory.c_str()));
2844         c1 -> Clear();    
2845     }
2846     c1 -> Print( Form("%s/dNdeta_1D_MC.pdf)", out_folder_directory.c_str()) );
2847 
2848 
2849     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2850     c1 -> Print( Form("%s/track_eta_z_2D_MC.pdf(", out_folder_directory.c_str()) );
2851     for (int i = 0; i < track_eta_z_2D_MC.size(); i++)
2852     {
2853         track_eta_z_2D_MC[i] -> Draw("colz0");
2854         DrawEtaZGrid();
2855         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2856         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2857         c1 -> Print(Form("%s/track_eta_z_2D_MC.pdf", out_folder_directory.c_str()));
2858         c1 -> Clear();    
2859     }
2860     c1 -> Print( Form("%s/track_eta_z_2D_MC.pdf)", out_folder_directory.c_str()) );
2861 
2862     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2863     clu_used_centrality_2D -> Draw("colz0");
2864     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2865     c1 -> Print( Form("%s/clu_used_centrality_2D.pdf", out_folder_directory.c_str()) );
2866     c1 -> Clear();
2867 
2868     // note : for the mega cluster study
2869     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2870     cluster4_track_phi_1D -> Draw("hist");
2871     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2872     c1 -> Print( Form("%s/cluster4_track_phi_1D.pdf", out_folder_directory.c_str()) );
2873     c1 -> Clear();
2874 
2875     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2876     cluster3_all_track_phi_1D -> Draw("hist");
2877     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2878     c1 -> Print( Form("%s/cluster3_all_track_phi_1D.pdf", out_folder_directory.c_str()) );
2879     c1 -> Clear();
2880 
2881     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2882     cluster3_inner_track_phi_1D -> Draw("hist");
2883     for (int i = 0; i < cluster3_inner_track_phi_1D -> GetNbinsX(); i++)
2884     {
2885         if (cluster3_inner_track_phi_1D -> GetBinContent(i+1) > 200)
2886         {
2887             cout<<i+1<<" mega Inner track phi bin center: "<<cluster3_inner_track_phi_1D -> GetBinCenter(i+1)<<" bin content: "<<cluster3_inner_track_phi_1D -> GetBinContent(i+1)<<endl;
2888         }
2889     }
2890 
2891     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2892     c1 -> Print( Form("%s/cluster3_inner_track_phi_1D.pdf", out_folder_directory.c_str()) );
2893     c1 -> Clear();
2894 
2895     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2896     cluster3_outer_track_phi_1D -> Draw("hist");
2897     for (int i = 0; i < cluster3_outer_track_phi_1D -> GetNbinsX(); i++)
2898     {
2899         if (cluster3_outer_track_phi_1D -> GetBinContent(i+1) > 200)
2900         {
2901             cout<<i+1<<" mega Outer track phi bin center: "<<cluster3_outer_track_phi_1D -> GetBinCenter(i+1)<<" bin content: "<<cluster3_outer_track_phi_1D -> GetBinContent(i+1)<<endl;
2902         }
2903     }
2904     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2905     c1 -> Print( Form("%s/cluster3_outer_track_phi_1D.pdf", out_folder_directory.c_str()) );
2906     c1 -> Clear();
2907 
2908     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2909     NClu4_track_centrality_2D -> Draw("colz0");
2910     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2911     c1 -> Print( Form("%s/NClu4_track_centrality_2D.pdf", out_folder_directory.c_str()) );
2912     c1 -> Clear();
2913 
2914     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2915     NClu3_track_centrality_2D -> Draw("colz0");
2916     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2917     c1 -> Print( Form("%s/NClu3_track_centrality_2D.pdf", out_folder_directory.c_str()) );
2918     c1 -> Clear();
2919 
2920     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2921     c1 -> Print( Form("%s/eta_z_region_hist_2D_MC.pdf(", out_folder_directory.c_str()) );
2922     for (int i = 0; i < eta_z_region_hist_2D_MC.size(); i++)
2923     {
2924         eta_z_region_hist_2D_MC[i] -> Draw("colz0");
2925         DrawEtaZGrid();
2926         ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2927         draw_text -> DrawLatex(0.21, 0.90, Form("Centrality : %s",centrality_region[i].c_str()));
2928         c1 -> Print(Form("%s/eta_z_region_hist_2D_MC.pdf", out_folder_directory.c_str()));
2929         c1 -> Clear();    
2930     }
2931     c1 -> Print( Form("%s/eta_z_region_hist_2D_MC.pdf)", out_folder_directory.c_str()) );
2932 
2933 
2934     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2935     eta_z_region_hist_2D_map -> Draw("colz0");
2936     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2937     c1 -> Print( Form("%s/eta_z_region_hist_2D_map.pdf", out_folder_directory.c_str()) );
2938     c1 -> Clear();
2939 
2940     // note : ----------------------------------------------------------------------------------------------------------------------------------------------------------------
2941     MBin_Z_hist_2D -> Draw("colz0");
2942     ltx->DrawLatex(1 - gPad->GetRightMargin(), 1 - gPad->GetTopMargin() + 0.01, Form("#it{#bf{sPHENIX INTT}} %s", plot_text.c_str()));
2943     c1 -> Print( Form("%s/MBin_Z_hist_2D.pdf", out_folder_directory.c_str()) );
2944     c1 -> Clear();
2945 
2946 }
2947 
2948 void INTTEta::EndRun()
2949 {
2950     for (int i = 0; i < N_GoodEvent_vec.size(); i++)
2951     {
2952         cout<<"N good evt break down : "<< i <<" "<<N_GoodEvent_vec[i]<<endl;
2953     }
2954 
2955     cout<<"N good evt inclusive : "<<N_GoodEvent<<endl;
2956 
2957     out_file -> cd();
2958     tree_out -> SetDirectory(out_file);
2959 
2960     // note : write the histogram of DeltaPhi for each centrality bin, each eta bin and each z bin
2961     // note : for the one that allows single cluster getting involved in multiple tracks
2962     for (int i = 0; i < final_track_multi_delta_phi_1D.size(); i++)
2963     {
2964         for (int i1 = 0; i1 < final_track_multi_delta_phi_1D[i].size(); i1++)
2965         {  
2966             final_track_multi_delta_phi_1D[i][i1] -> Write(Form("Reco_Multi_MBin%i_Eta%i_Z%i", i, eta_z_convert_inverse_map[i1].first, eta_z_convert_inverse_map[i1].second));
2967         }
2968     }
2969 
2970     // note : write the histogram of DeltaPhi for each centrality bin, each eta bin and each z bin
2971     // note : for the ones that only allow single cluster to be used in one track
2972     for (int i = 0; i < final_track_delta_phi_1D.size(); i++)
2973     {
2974         for (int i1 = 0; i1 < final_track_delta_phi_1D[i].size(); i1++)
2975         {  
2976             final_track_delta_phi_1D[i][i1] -> Write(Form("Reco_Single_MBin%i_Eta%i_Z%i", i, eta_z_convert_inverse_map[i1].first, eta_z_convert_inverse_map[i1].second));
2977         }
2978     }
2979 
2980     // note : number of true track for each centrality bin, each eta bin and each z bin
2981     for (int i = 0; i < eta_z_region_hist_2D_MC.size(); i++) 
2982     { 
2983         eta_z_region_hist_2D_MC[i] -> Write(Form("NTrueTrack_MBin%i",i));
2984     }
2985 
2986     // note : the map for the eta-z reference
2987     eta_z_region_hist_2D_map -> Write("Eta_Z_reference");
2988     
2989     // note : the number of event for each centrality bin and z vertex bin
2990     MBin_Z_hist_2D -> Write("Z_MBin_evt_map");
2991 
2992     // note : save the tracklet detailed information with the case with tight zvtx cut
2993     tree_out -> Write("", TObject::kOverwrite);
2994 
2995 
2996     out_file -> Close();
2997 
2998     return;
2999 }
3000 
3001 double INTTEta::grEY_stddev(TGraphErrors * input_grr)
3002 {
3003     vector<double> input_vector; input_vector.clear();
3004     for (int i = 0; i < input_grr -> GetN(); i++) {input_vector.push_back( input_grr -> GetPointY(i) );}
3005 
3006     double average = accumulate( input_vector.begin(), input_vector.end(), 0.0 ) / double(input_vector.size());
3007 
3008     double sum_subt = 0;
3009     for (int ele : input_vector) {sum_subt+=pow((ele-average),2);}
3010     
3011     return sqrt(sum_subt/(input_vector.size()-1));
3012 }   
3013 
3014 pair<double, double> INTTEta::mirrorPolynomial(double a, double b) {
3015     // Interchange 'x' and 'y'
3016     double mirroredA = 1.0 / a;
3017     double mirroredB = -b / a;
3018 
3019     return {mirroredA, mirroredB};
3020 }
3021 
3022 // note : pair<reduced chi2, eta of the track>
3023 // note : vector : {r,z}
3024 // note : p0 : vertex point {r,z,zerror}
3025 // note : p1 : inner layer
3026 // note : p2 : outer layer
3027 pair<double,double> INTTEta::Get_eta(vector<double>p0, vector<double>p1, vector<double>p2)
3028 {
3029     // if (track_gr -> GetN() != 0) {cout<<"In INTTEta class, track_gr is not empty, track_gr size : "<<track_gr -> GetN()<<endl; exit(0);}
3030     
3031     if (track_gr -> GetN() != 0) {track_gr -> Set(0);}
3032     
3033     vector<double> r_vec  = {p0[0], p1[0], p2[0]}; 
3034     vector<double> z_vec  = {p0[1], p1[1], p2[1]}; 
3035     vector<double> re_vec = {0, 0, 0}; 
3036     vector<double> ze_vec = {p0[2], ( fabs( p1[1] ) < 130 ) ? 8. : 10., ( fabs( p2[1] ) < 130 ) ? 8. : 10.}; 
3037 
3038     // note : swap the r and z, to have easier fitting 
3039     // note : in principle, Z should be in the x axis, R should be in the Y axis
3040     for (int i = 0; i < 3; i++)
3041     {
3042         track_gr -> SetPoint(i,r_vec[i],z_vec[i]);
3043         track_gr -> SetPointError(i,re_vec[i],ze_vec[i]);
3044 
3045         // cout<<"In INTTEta class, point : "<<i<<" r : "<<r_vec[i]<<" z : "<<z_vec[i]<<" re : "<<re_vec[i]<<" ze : "<<ze_vec[i]<<endl;
3046     }    
3047     
3048     double vertical_line = ( fabs( grEY_stddev(track_gr) ) < 0.00001 ) ? 1 : 0;
3049     
3050     if (vertical_line) {return {0,0};}
3051     else 
3052     {
3053         fit_rz -> SetParameters(0,0);
3054 
3055         track_gr -> Fit(fit_rz,"NQ");
3056 
3057         pair<double,double> ax_b = mirrorPolynomial(fit_rz -> GetParameter(1),fit_rz -> GetParameter(0));
3058 
3059         return  {(fit_rz -> GetChisquare() / double(fit_rz -> GetNDF())), -1 * TMath::Log( fabs( tan( atan2(ax_b.first, (ax_b.first > 0) ? 1. : -1. ) / 2 ) ) )};
3060     }
3061 
3062 }
3063 
3064 // note : angle_1 = inner clu phi
3065 // note: angle_2 = outer clu phi
3066 double INTTEta::get_delta_phi(double angle_1, double angle_2)
3067 {
3068     vector<double> vec_abs = {fabs(angle_1 - angle_2), fabs(angle_1 - angle_2 + 360), fabs(angle_1 - angle_2 - 360)};
3069     vector<double> vec = {(angle_1 - angle_2), (angle_1 - angle_2 + 360), (angle_1 - angle_2 - 360)};
3070     return vec[std::distance(vec_abs.begin(), std::min_element(vec_abs.begin(),vec_abs.end()))];
3071 }
3072 
3073 double INTTEta::get_track_phi(double inner_clu_phi_in, double delta_phi_in)
3074 {
3075     double track_phi = inner_clu_phi_in - (delta_phi_in/2.);
3076     if (track_phi < 0) {track_phi += 360;}
3077     else if (track_phi > 360) {track_phi -= 360;}
3078     else if (track_phi == 360) {track_phi = 0;}
3079     else {track_phi = track_phi;}
3080     return track_phi;
3081 }
3082 
3083 double INTTEta::convertTo360(double radian) {
3084 
3085     double angle = radian * (180./M_PI);
3086     
3087     if (fabs(radian) == M_PI) {return 180.;}
3088     else if (radian == 0)
3089     {
3090         return 0;
3091     }
3092     else if ( radian > 0 )
3093     {
3094         return angle;
3095     }
3096     else
3097     {
3098         return angle + 360;
3099     }
3100 }
3101 
3102 double INTTEta::get_clu_eta(vector<double> vertex, vector<double> clu_pos)
3103 {
3104     double correct_x = clu_pos[0] - vertex[0];
3105     double correct_y = clu_pos[1] - vertex[1];
3106     double correct_z = clu_pos[2] - vertex[2];
3107     double clu_r = sqrt(pow(correct_x,2) + pow(correct_y,2));
3108     // cout<<"correct info : "<<correct_x<<" "<<correct_y<<" "<<correct_z<<" "<<clu_r<<endl;
3109 
3110     return -0.5 * TMath::Log((sqrt(pow(correct_z,2)+pow(clu_r,2))-(correct_z)) / (sqrt(pow(correct_z,2)+pow(clu_r,2))+(correct_z)));
3111 }
3112 
3113 pair<int,int> INTTEta::GetTH2BinXY(TH2F * hist_in, int binglobal)
3114 {
3115     // cout<<"so detail 1 "<<endl;
3116     if (binglobal == -1) {return {-1,-1};}
3117     // cout<<"so detail 2 "<<endl;
3118     int nx  = hist_in->GetNbinsX()+2;
3119     int ny  = hist_in->GetNbinsX()+2;
3120     // cout<<"so detail 3 "<<endl;
3121     int binx = binglobal%nx;
3122     int biny = ((binglobal-binx)/nx)%ny;
3123     // cout<<"so detail 4 "<<endl;
3124     // cout<<binx<<" "<<biny<<endl;
3125 
3126     // note : the binx and biny start from 1
3127     return {binx, biny};
3128 }
3129 
3130 double INTTEta::GetTH2Index1D(pair<int,int> XY_index, TH2F * hist2D_in)
3131 {
3132     if (XY_index.first == -1) {return -1;}
3133 
3134     // note : XY_index.first : x index, starts from 1
3135     // note : XY_index.second : y index, starts from 1
3136     return (XY_index.first - 1) + (XY_index.second - 1) * hist2D_in -> GetNbinsX();
3137 }
3138 
3139 void INTTEta::DrawEtaZGrid()
3140 {
3141     // note : draw the vertical line, to segment the eta region
3142     for (int i = 0; i < eta_region.size(); i++) { coord_line -> DrawLine(eta_region[i], z_region[0], eta_region[i], z_region[z_region.size() - 1]); }
3143 
3144     // note : draw the horizontal line, to segment the z region
3145     for (int i = 0; i < z_region.size(); i++) { coord_line -> DrawLine(eta_region[0], z_region[i], eta_region[eta_region.size() - 1], z_region[i]); }
3146 }
3147 
3148 #endif