Что я делаю неправильно, заполняя этот вектор пары? - PullRequest
0 голосов
/ 01 декабря 2011

Если я сделаю:

vector<string> vec_jets;

double values[] = {
    transEnergy(map_jets, "jet1"),
    transEnergy(map_jets, "jet2"),
    transEnergy(map_jets, "jet3"),
    transEnergy(map_jets, "jet4"),
    transEnergy(map_jets, "jet5"),
    transEnergy(map_jets, "jet6"),
    transEnergy(map_jets, "jet7") };

for( int j = 1; j <= Njets; j++){
  oss << "jet" << j;
  vec_jets.push_back( oss.str() );
  oss.str("");
}

vector<pair<string,double> > jets_pt( vec_jets.size() );

// for( int k = 0; k < Njets; k++ ){ 
  // if( jet_preselection(map_jets,map_leps,vec_jets[k],jets_emfr[k]) )

        transform(
            vec_jets.begin(),
            vec_jets.end(), 
            values,
            jets_pt.begin(),
            make_pair<string,double>
        );

//    }  

У меня есть вывод, который я хочу, например,

jet1 32.4717

Но, если я раскомментирую цикл for и условие if, кажется, что вектор больше не заполнен, если я прошу его обработать, я всегда получаю только 0.

Функция в операторе if это просто bool

bool jet_preselection(
    map<string, TLorentzVector> map_jets,
    map<string, TLorentzVector> map_leps,
    string vec_jets,
    double jet_emfr )
{

        return ( map_jets[vec_jets].E()*sin(map_jets[vec_jets].Theta()) > 15 
            && jet_emfr < 0.9
            && fabs(map_jets[vec_jets].PseudoRapidity()) > 2.5
            && ( map_jets[vec_jets].DeltaR(map_leps["lep1"]) > 0.4
                && map_jets[vec_jets].DeltaR(map_leps["lep2"]) > 0.4
                && map_jets[vec_jets].DeltaR(map_leps["lep3"]) > 0.4 );
}

1 Ответ

0 голосов
/ 01 декабря 2011

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

bool jet_preselection(map<string, TLorentzVector> map_jets, map<string, TLorentzVector> map_leps, string vec_jets, double jet_emfr)

... вы передаете map_jets и map_leps по значению скорее по ссылке (предпочтительно) или по указателю, так что когда вы вызываете эту функцию, создается полная копия этих map s.

Вы можете рассмотреть вопрос об изменении способа передачи этих параметров.Возможно, передача копий этих карт изменила бы их состояние таким образом, что jet_preselection потерпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...