34 gPad->PaintPolyLine(2, &x[0], &y[0], option);
40 gPad->PaintPolyLine(2, &x[0], &y[0], option);
46 gPad->PaintPolyLine(2, &x[0], &y[0], option);
49 int py0 = gPad->YtoPixel(0);
50 fLabel->SetText(0.93, gPad->PixeltoY((gPad->YtoPixel(
fLabelPos)-2)) - gPad->PixeltoY(py0), energy_string.c_str());
53 fLabel->SetTextColor(GetLineColor());
61 if (
px > gPad->XtoAbsPixel(0.9)) { dx =
px - gPad->XtoAbsPixel(0.9); }
62 else if (
px < gPad->XtoAbsPixel(0.1)) { dx = gPad->XtoAbsPixel(0.1) -
px; }
64 double main_dist = sqrt(dx*dx + dy*dy);
67 if (
px > gPad->XtoAbsPixel(0.97)) { dx =
px - gPad->XtoAbsPixel(0.97); }
68 else if (
px < gPad->XtoAbsPixel(0.93)) { dx = gPad->XtoAbsPixel(0.93) -
px; }
70 double label_dist = sqrt(dx*dx + dy*dy);
73 double connecting_dist = DistancetoLine(
px,
py,
74 gPad->XtoAbsPixel(0.93),
76 gPad->XtoAbsPixel(0.97),
79 return std::min(std::min(main_dist, label_dist), connecting_dist);
220 Int_t npars = (int)
fStates.size() - 1;
221 std::cout << npars << std::endl;
222 auto gMinuit =
new TMinuit(npars);
225 gMinuit->SetFCN(func.
minuit);
227 Double_t arglist[10];
232 gMinuit->mnexcm(
"SET ERR", arglist, 1, ierflg);
234 gMinuit->mnexcm(
"SET STR", arglist, 1, ierflg);
238 for (
int i=1; i<=npars; ++i ) {
239 std::cout <<
"Setting up level " << i << std::endl;
241 gMinuit->mnparm(parnum, (
"Level "+std::to_string(i)).c_str(), energy,
GetStateByIndex(i)->fUncertainty, 0.8*energy, 1.2*energy, ierflg);
249 gMinuit->mnexcm(
"MINIGRAD", arglist, 2, ierflg);
253 gMinuit->mnexcm(
"HESSE", arglist, 2, ierflg);
257 for (
int i=1; i<=gMinuit->GetNumPars(); ++i) {
258 double parVal, parErr;
259 gMinuit->GetParameter(i-1, parVal, parErr);
270 std::vector<State*> states;
272 states.push_back(&state.second);
275 std::sort(states.begin(), states.end(),
282 printf(
"Printing state energies for %i states\n", (
int)states.size());
283 for (
int i=0; i<(int)states.size(); ++i) {
284 printf(
"Level %d : %10s : %8.4f %7.5f\n", states[i]->index, states[i]->GetName(), states[i]->fEnergy, states[i]->fUncertainty);
330 gPad->SetFrameLineColor(0);
336 std::map<int, State*> range_states;
337 std::map<int, State*> extra_states;
338 std::vector<int> drawn_indexes;
339 double max_energy = 0;
341 if (state.second.fEnergy < eLow || state.second.fEnergy > eHigh) {
continue; }
342 else { range_states[state.second.index] = &state.second; drawn_indexes.push_back(state.second.index); }
343 if (state.second.fEnergy > max_energy) {
344 max_energy = state.second.fEnergy;
349 int nTransitions = 0;
350 for (
auto &state : range_states) {
352 if (transition.fInitial->index == state.second->index) {
354 if (range_states.find(transition.fFinal->index)==range_states.end() && extra_states.find(transition.fFinal->index)==extra_states.end()) {
355 extra_states[transition.fFinal->index] = transition.fFinal;
356 drawn_indexes.push_back(transition.fFinal->index);
362 std::sort(drawn_indexes.begin(), drawn_indexes.end());
364 if (drawn_indexes[0] != 0) { drawn_indexes.insert(drawn_indexes.begin(), 0); }
366 fDrawHist->SetBins(100, 0.0, 1.0, 100, 0.0, (
int)((1.1*max_energy)/10)*10);
367 gStyle->SetOptStat(0);
371 fAxis =
new TGaxis(0, 0, 0, (
int)((1.1*max_energy)/10)*10 , 0, (
int)((1.1*max_energy)/10)*10, 510,
"");
375 double transition_spacing = 0.8/(double)nTransitions;
378 for (
int i=0; i<(int)drawn_indexes.size(); ++i) {
379 int index = drawn_indexes[i];
386 TText *test =
new TText();
387 test->SetTextSize(15);
388 int py0 = gPad->YtoPixel(0);
389 double label_threshold = gPad->PixeltoY(py0-(test->GetTextSize()+3)) - gPad->PixeltoY(py0);
391 label_threshold = fabs(label_threshold);
392 double state_threshold = 40;
396 for (
int i = 0; i < (int)drawn_indexes.size()-1; ++i) {
403 state1->
fLabelPos = av-1.001*label_threshold/2.0;
404 state2->
fLabelPos = av+1.001*label_threshold/2.0;
411 state1->
fDrawPos = av-1.001*state_threshold/2.0;
412 state2->
fDrawPos = av+1.001*state_threshold/2.0;
418 std::vector<Transition*> draw_transitions;
420 for (
int i=0; i<(int)drawn_indexes.size(); ++i) {
421 int index = drawn_indexes[i];
425 if (!gPad->GetListOfPrimitives()->Contains(state)) {
429 std::vector<Transition*> state_transitions;
431 if (transition.fInitial->index == state->
index && range_states.find(state->
index) != range_states.end()) {
432 state_transitions.push_back(&transition);
433 draw_transitions.push_back(&transition);
437 std::sort(state_transitions.begin(), state_transitions.end(),
443 for (
auto &transition : state_transitions) {
446 transition->SetX1(0.9-(
double)count*transition_spacing-0.5*transition_spacing);
448 transition->SetX2(0.9-(
double)count*transition_spacing-0.5*transition_spacing);
449 transition->SetY2(finalState->
fDrawPos);
456 for (
auto &transition : draw_transitions) {
458 if (!gPad->GetListOfPrimitives()->Contains(transition)) {
459 transition->AppendPad();
468 std::ofstream outfile(filename);
472 for (
int i=0; i<
fStates.size(); ++i) {
475 std::vector<Transition> transitions;
477 if (state == transition.fInitial) {
478 transitions.push_back(transition);
479 std::cout << state->fEnergy <<
" " << transition.fInitial->fEnergy <<
" " << transition.fEnergy << std::endl;
483 for (
int j=0; j<transitions.size(); ++j) {
490 outfile <<
GamR::Utils::wrresult(transitions[j].fEnergy, transitions[j].fUncertainty) <<
" & " <<
GamR::Utils::wrresult(transitions[j].fFinal->fEnergy, transitions[j].fFinal->fUncertainty) <<
"\\\\" << std::endl;