Добавление четырех векторов c ++ с использованием std :: transform () - PullRequest
0 голосов
/ 26 января 2019

У меня проблема с добавлением четырех векторов с использованием std::transform. Это звучит как простая проблема, но я не мог сделать это. Предположим, у меня есть следующее:

std::vector<double> No_of_sgn1, No_of_sgn2, No_of_sgn3, No_of_sgn4;

Каждый из этих векторов имеет 4 элемента (двойной). Поэтому я попытался добавить только два вектора как:

std::transform(No_of_sgn1.begin(), No_of_sgn1.end(), No_of_sgn2.begin(), No_of_sgn1.begin(), std::plus<double>());

Я предполагаю, что No_of_sgn2 будет добавлен к No_of_sgn1, затем я печатаю, чтобы посмотреть, каков результат:

std::cout << No_of_sgn1[0] << std::endl;

Однако код здесь ломается, давая мне:

* Перерыв * нарушение сегментации

    TString getlabel(TString fileName, bool nu = false){

 TString g = "";

  if(fileName.Contains("345060"))       g = "ggH";
  if(fileName.Contains("344235"))       g = "VBF";
  if(fileName.Contains("AZNLO_VH"))     g = "VH";
  if(fileName.Contains("ttH125_ZZ4l"))  g = "ttH";
  if(fileName.Contains("Zjet"))         g = "Z+jets";
  if(fileName.Contains("A14_ttbar"))    g = "tt";


 return g;
}

TString getbinName(int xBin,TString type);
map<TString, std::map<int, double>> val;

    int main(){
//this part contains the place where the data imported
TChain *chain = new TChain("tree_relaxIsoD0");

chain->Add("~/cernbox/Lepron_Isolation/samples/Prod_v18/mc16a/Signal/mc16_13TeV.345060.PowhegPythia8EvtGen_NNLOPS_nnlo_30_ggH125_ZZ4l_bkgCR.root");               //ggH
chain->Add("~/cernbox/Lepron_Isolation/samples/Prod_v18/mc16a/Signal/mc16_13TeV.344235.PowhegPy8EG_NNPDF30_AZNLOCTEQ6L1_VBFH125_ZZ4lep_notau_bkgCR.root");        //VBF
chain->Add("~/cernbox/Lepron_Isolation/samples/Prod_v18/mc16a/Signal/mc16a_13TeV.PowhegPythia8EvtGen_NNPDF30_AZNLO_VH_MINLO_bkgCR_merged_3s.root");  //VH
chain->Add("~/cernbox/Lepron_Isolation/samples/Prod_v18/mc16a/Signal/mc16a_13TeV.PowhegPy8EG_A14NNPDF23_NNPDF30ME_ttH125_ZZ4l_allhad_merged_3s.root");            //ttH
chain->Add("~/cernbox/Lepron_Isolation/samples/Prod_v18/mc16a/BkgCR/mc16_13TeV.Sherpa_NNPDF30NNLO_Zjet_bkgCR_merged_4s.root"); //Z+jets
chain->Add("~/cernbox/Lepron_Isolation/samples/Prod_v18/mc16a/BkgCR/mc16_13TeV.410289.PhPy8EG_A14_ttbar_hdamp258p75_4lMFilt_40_8_bkgCR.root");                    //ttbar


Histos a(chain);
a.Loop();

return 0;
}

for(int j=2; j<6;j++){
    if(groupName=="ggH" ) No_of_sgn1.push_back(val[groupName][j]);
    if(groupName=="VBF" ) No_of_sgn2.push_back(val[groupName][j]);
    if(groupName=="VH" ) No_of_sgn3.push_back(val[groupName][j]); 
    if(groupName=="ttH" ) No_of_sgn4.push_back(val[groupName][j]);
    if(groupName=="Z+jets") No_of_bkg1.push_back(val[groupName][j]);
    if(groupName=="tt" ) No_of_bkg2.push_back(val[groupName][j]);
 }

это было что-то вроде выше. До здесь все хорошо. Я даже распечатал значения всех векторов, и они выглядят совершенно правильно. Вот как я печатаю первый вектор:

 "if(groupName=="ggH") cout<<groupName<<":"<<" 4mu: "<<No_of_sgn1[0]<<" 4e: "<<No_of_sgn1[1]<<" 2mu2e: "<<No_of_sgn1[2]<<" 2e2mu: "<<No_of_sgn1[3]<<endl; ".

И вывод:

"ggH: 4mu: 0,869109 4e: 0,452978 2mu2e: 0,485973 2e2mu: 0,605595

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 26 января 2019

Большое спасибо всем.Мне довелось решить проблему.Сначала я преобразовал все векторы в массивы, как показано ниже:

double s1[3]; double s2[3]; double s3[3]; double s4[3];
double b1[3]; double b2[3];

std::copy(No_of_sgn1.begin(), No_of_sgn1.end(), s1);
std::copy(No_of_sgn2.begin(), No_of_sgn2.end(), s2);
std::copy(No_of_sgn3.begin(), No_of_sgn3.end(), s3);
std::copy(No_of_sgn4.begin(), No_of_sgn4.end(), s4);
std::copy(No_of_bkg1.begin(), No_of_bkg1.end(), b1);
std::copy(No_of_bkg2.begin(), No_of_bkg2.end(), b2);

Затем я сделал следующее:

double No_of_sgn[3];
double No_of_bkg[3];

for(int g=0; g<4;g++){
  No_of_sgn[g] =  s1[g]+s2[g]+s3[g]+s4[g];
  No_of_bkg[g] =  b1[g]+b2[g];
}

cout<<" 4mu: "<<No_of_sgn[0]<<" 4e: "<<No_of_sgn[1]<<" 2mu2e: "<<No_of_sgn[2]<<" 2e2mu: "<<No_of_sgn[3]<<endl;

Вывод cout:

4mu: 18.9752 4e: 9.90788 2mu2e: 10.5984 2e2mu: 13.2445

Что я и хотел :)

Ура,

Абдуалазем.

...