#include "hchannellistmaker.h"
ClassImp(HChannelListMaker)
HChannelListMaker::HChannelListMaker ()
{
}
HChannelListMaker::~HChannelListMaker()
{
}
Double_t HChannelListMaker::sqr (Double_t value)
{return value*value;}
Int_t HChannelListMaker::getPid (const Char_t* nomen)
{Int_t pid;
pid = bLib.nmToIndex (nomen,&Phys);
if (pid == 0) {printf ("getPid: unknown particle '%s'\n",nomen); abort ();}
else return pid;
}
void HChannelListMaker::getDecayList ()
{
decPartsNmb = 29;
decPart[ 1].pID = getPid ("pi0");
decPart[ 1].cTau = 25.1e-7;
decPart[ 1].decaysNmb = 2;
decPart[ 1].decay[1].prong = 1;
decPart[ 1].decay[1].pID[1] = getPid ("pi0_");
decPart[ 1].decay[2].prong = 3;
decPart[ 1].decay[2].pID[1] = getPid ("e+");
decPart[ 1].decay[2].pID[2] = getPid ("e-");
decPart[ 1].decay[2].pID[3] = getPid ("g" );
decPart[ 2].pID = getPid ("eta");
decPart[ 2].cTau = 0.001;
decPart[ 2].decaysNmb = 4;
decPart[ 2].decay[1].prong = 3;
decPart[ 2].decay[1].pID[1] = getPid ("pi+");
decPart[ 2].decay[1].pID[2] = getPid ("pi-");
decPart[ 2].decay[1].pID[3] = getPid ("pi0_");
decPart[ 2].decay[2].prong = 3;
decPart[ 2].decay[2].pID[1] = getPid ("pi+");
decPart[ 2].decay[2].pID[2] = getPid ("pi-");
decPart[ 2].decay[2].pID[3] = getPid ("g");
decPart[ 2].decay[3].prong = 3;
decPart[ 2].decay[3].pID[1] = getPid ("e+");
decPart[ 2].decay[3].pID[2] = getPid ("e-");
decPart[ 2].decay[3].pID[3] = getPid ("g");
decPart[ 2].decay[4].prong = 4;
decPart[ 2].decay[4].pID[1] = getPid ("pi+");
decPart[ 2].decay[4].pID[2] = getPid ("pi-");
decPart[ 2].decay[4].pID[3] = getPid ("e+");
decPart[ 2].decay[4].pID[4] = getPid ("e-");
decPart[ 3].pID = getPid ("K0S");
decPart[ 3].cTau = 2.6762;
decPart[ 3].decaysNmb = 1;
decPart[ 3].decay[1].prong = 2;
decPart[ 3].decay[1].pID[1] = getPid ("pi+");
decPart[ 3].decay[1].pID[2] = getPid ("pi-");
decPart[ 4].pID = getPid ("Lamb");
decPart[ 4].cTau = 7.89;
decPart[ 4].decaysNmb = 1;
decPart[ 4].decay[1].prong = 2;
decPart[ 4].decay[1].pID[1] = getPid ("p");
decPart[ 4].decay[1].pID[2] = getPid ("pi-");
decPart[ 5].pID = getPid ("Sig+");
decPart[ 5].cTau = 2.396;
decPart[ 5].decaysNmb = 1;
decPart[ 5].decay[1].prong = 2;
decPart[ 5].decay[1].pID[1] = getPid ("n");
decPart[ 5].decay[1].pID[2] = getPid ("pi+");
decPart[ 6].pID = getPid ("Sig0");
decPart[ 6].cTau = 2.22e-9;
decPart[ 6].decaysNmb = 1;
decPart[ 6].decay[1].prong = 3;
decPart[ 6].decay[1].pID[1] = getPid ("p");
decPart[ 6].decay[1].pID[2] = getPid ("pi-");
decPart[ 6].decay[1].pID[3] = getPid ("g");
decPart[ 7].pID = getPid ("Sig-");
decPart[ 7].cTau = 4.434;
decPart[ 7].decaysNmb = 1;
decPart[ 7].decay[1].prong = 2;
decPart[ 7].decay[1].pID[1] = getPid ("n");
decPart[ 7].decay[1].pID[2] = getPid ("pi-");
decPart[ 8].pID = getPid ("Xi0");
decPart[ 8].cTau = 8.71;
decPart[ 8].decaysNmb = 1;
decPart[ 8].decay[1].prong = 3;
decPart[ 8].decay[1].pID[1] = getPid ("p");
decPart[ 8].decay[1].pID[2] = getPid ("pi-");
decPart[ 8].decay[1].pID[3] = getPid ("pi0_");
decPart[ 9].pID = getPid ("Xi-");
decPart[ 9].cTau = 4.91;
decPart[ 9].decaysNmb = 1;
decPart[ 9].decay[1].prong = 3;
decPart[ 9].decay[1].pID[1] = getPid ("p");
decPart[ 9].decay[1].pID[2] = getPid ("pi-");
decPart[ 9].decay[1].pID[3] = getPid ("pi-");
decPart[10].pID = getPid ("Omg-");
decPart[10].cTau = 2.46;
decPart[10].decaysNmb = 2;
decPart[10].decay[1].prong = 3;
decPart[10].decay[1].pID[1] = getPid ("p");
decPart[10].decay[1].pID[2] = getPid ("pi-");
decPart[10].decay[1].pID[3] = getPid ("K-");
decPart[10].decay[2].prong = 4;
decPart[10].decay[2].pID[1] = getPid ("p");
decPart[10].decay[2].pID[2] = getPid ("pi-");
decPart[10].decay[2].pID[3] = getPid ("pi-");
decPart[10].decay[2].pID[4] = getPid ("pi0_");
decPart[11].pID = getPid ("~Lamb");
decPart[11].cTau = 7.89;
decPart[11].decaysNmb = 1;
decPart[11].decay[1].prong = 2;
decPart[11].decay[1].pID[1] = getPid ("~p");
decPart[11].decay[1].pID[2] = getPid ("pi+");
decPart[12].pID = getPid ("~Sig-");
decPart[12].cTau = 4.434;
decPart[12].decaysNmb = 1;
decPart[12].decay[1].prong = 2;
decPart[12].decay[1].pID[1] = getPid ("~n");
decPart[12].decay[1].pID[2] = getPid ("pi+");
decPart[13].pID = getPid ("~Sig0");
decPart[13].cTau = 2.22e-9;
decPart[13].decaysNmb = 1;
decPart[13].decay[1].prong = 3;
decPart[13].decay[1].pID[1] = getPid ("~p");
decPart[13].decay[1].pID[2] = getPid ("pi+");
decPart[13].decay[1].pID[3] = getPid ("g");
decPart[14].pID = getPid ("~Sig+");
decPart[14].cTau = 2.396;
decPart[14].decaysNmb = 1;
decPart[14].decay[1].prong = 2;
decPart[14].decay[1].pID[1] = getPid ("~n");
decPart[14].decay[1].pID[2] = getPid ("pi-");
decPart[15].pID = getPid ("~Xi0");
decPart[15].cTau = 8.71;
decPart[15].decaysNmb = 1;
decPart[15].decay[1].prong = 3;
decPart[15].decay[1].pID[1] = getPid ("~p");
decPart[15].decay[1].pID[2] = getPid ("pi+");
decPart[15].decay[1].pID[3] = getPid ("pi0_");
decPart[16].pID = getPid ("~Xi-");
decPart[16].cTau = 4.91;
decPart[16].decaysNmb = 1;
decPart[16].decay[1].prong = 3;
decPart[16].decay[1].pID[1] = getPid ("~p");
decPart[16].decay[1].pID[2] = getPid ("pi+");
decPart[16].decay[1].pID[3] = getPid ("pi+");
decPart[17].pID = getPid ("~Omg-");
decPart[17].cTau = 2.46;
decPart[17].decaysNmb = 2;
decPart[17].decay[1].prong = 3;
decPart[17].decay[1].pID[1] = getPid ("~p");
decPart[17].decay[1].pID[2] = getPid ("pi+");
decPart[17].decay[1].pID[3] = getPid ("K+");
decPart[17].decay[2].prong = 4;
decPart[17].decay[2].pID[1] = getPid ("~p");
decPart[17].decay[2].pID[2] = getPid ("pi+");
decPart[17].decay[2].pID[3] = getPid ("pi+");
decPart[17].decay[2].pID[4] = getPid ("pi0_");
decPart[18].pID = getPid ("rho+");
decPart[18].cTau = 0.001;
decPart[18].decaysNmb = 2;
decPart[18].decay[1].prong = 2;
decPart[18].decay[1].pID[1] = getPid ("pi+");
decPart[18].decay[1].pID[2] = getPid ("pi0_");
decPart[18].decay[2].prong = 2;
decPart[18].decay[2].pID[1] = getPid ("pi+");
decPart[18].decay[2].pID[2] = getPid ("g");
decPart[19].pID = getPid ("rho-");
decPart[19].cTau = 0.001;
decPart[19].decaysNmb = 2;
decPart[19].decay[1].prong = 2;
decPart[19].decay[1].pID[1] = getPid ("pi-");
decPart[19].decay[1].pID[2] = getPid ("pi0_");
decPart[19].decay[2].prong = 2;
decPart[19].decay[2].pID[1] = getPid ("pi-");
decPart[19].decay[2].pID[2] = getPid ("g");
decPart[20].pID = getPid ("rho0");
decPart[20].cTau = 0.001;
decPart[20].decaysNmb = 2;
decPart[20].decay[1].prong = 2;
decPart[20].decay[1].pID[1] = getPid ("pi+");
decPart[20].decay[1].pID[2] = getPid ("pi-");
decPart[20].decay[2].prong = 3;
decPart[20].decay[2].pID[1] = getPid ("pi+");
decPart[20].decay[2].pID[2] = getPid ("pi-");
decPart[20].decay[2].pID[3] = getPid ("g");
decPart[21].pID = getPid ("w");
decPart[21].cTau = 0.001;
decPart[21].decaysNmb = 2;
decPart[21].decay[1].prong = 3;
decPart[21].decay[1].pID[1] = getPid ("pi+");
decPart[21].decay[1].pID[2] = getPid ("pi-");
decPart[21].decay[1].pID[3] = getPid ("pi0_");
decPart[21].decay[2].prong = 2;
decPart[21].decay[2].pID[1] = getPid ("pi+");
decPart[21].decay[2].pID[2] = getPid ("pi-");
decPart[22].pID = getPid ("D++");
decPart[22].cTau = 0.001;
decPart[22].decaysNmb = 1;
decPart[22].decay[1].prong = 2;
decPart[22].decay[1].pID[1] = getPid ("p");
decPart[22].decay[1].pID[2] = getPid ("pi+");
decPart[23].pID = getPid ("D+");
decPart[23].cTau = 0.001;
decPart[23].decaysNmb = 3;
decPart[23].decay[1].prong = 2;
decPart[23].decay[1].pID[1] = getPid ("p");
decPart[23].decay[1].pID[2] = getPid ("pi0_");
decPart[23].decay[2].prong = 2;
decPart[23].decay[2].pID[1] = getPid ("p");
decPart[23].decay[2].pID[2] = getPid ("g");
decPart[23].decay[3].prong = 2;
decPart[23].decay[3].pID[1] = getPid ("n");
decPart[23].decay[3].pID[2] = getPid ("pi+");
decPart[24].pID = getPid ("D0");
decPart[24].cTau = 0.001;
decPart[24].decaysNmb = 1;
decPart[24].decay[1].prong = 2;
decPart[24].decay[1].pID[1] = getPid ("p");
decPart[24].decay[1].pID[2] = getPid ("pi-");
decPart[25].pID = getPid ("D-");
decPart[25].cTau = 0.001;
decPart[25].decaysNmb = 1;
decPart[25].decay[1].prong = 2;
decPart[25].decay[1].pID[1] = getPid ("n");
decPart[25].decay[1].pID[2] = getPid ("pi-");
decPart[26].pID = getPid ("NP11+");
decPart[26].cTau = 0.001;
decPart[26].decaysNmb = 8;
decPart[26].decay[1].prong = 2;
decPart[26].decay[1].pID[1] = getPid ("p");
decPart[26].decay[1].pID[2] = getPid ("pi0_");
decPart[26].decay[2].prong = 2;
decPart[26].decay[2].pID[1] = getPid ("n");
decPart[26].decay[2].pID[2] = getPid ("pi+");
decPart[26].decay[3].prong = 3;
decPart[26].decay[3].pID[1] = getPid ("p");
decPart[26].decay[3].pID[2] = getPid ("pi+");
decPart[26].decay[3].pID[3] = getPid ("pi-");
decPart[26].decay[4].prong = 2;
decPart[26].decay[4].pID[1] = getPid ("D+");
decPart[26].decay[4].pID[2] = getPid ("pi0_");
decPart[26].decay[5].prong = 2;
decPart[26].decay[5].pID[1] = getPid ("D++");
decPart[26].decay[5].pID[2] = getPid ("pi-");
decPart[26].decay[6].prong = 2;
decPart[26].decay[6].pID[1] = getPid ("D0");
decPart[26].decay[6].pID[2] = getPid ("pi+");
decPart[26].decay[7].prong = 2;
decPart[26].decay[7].pID[1] = getPid ("p");
decPart[26].decay[7].pID[2] = getPid ("rho0");
decPart[26].decay[8].prong = 2;
decPart[26].decay[8].pID[1] = getPid ("n");
decPart[26].decay[8].pID[2] = getPid ("rho+");
decPart[27].pID = getPid ("ND13+");
decPart[27].cTau = 0.001;
decPart[27].decaysNmb = 8;
decPart[27].decay[1].prong = 2;
decPart[27].decay[1].pID[1] = getPid ("p");
decPart[27].decay[1].pID[2] = getPid ("pi0_");
decPart[27].decay[2].prong = 2;
decPart[27].decay[2].pID[1] = getPid ("n");
decPart[27].decay[2].pID[2] = getPid ("pi+");
decPart[27].decay[3].prong = 3;
decPart[27].decay[3].pID[1] = getPid ("p");
decPart[27].decay[3].pID[2] = getPid ("pi+");
decPart[27].decay[3].pID[3] = getPid ("pi-");
decPart[27].decay[4].prong = 2;
decPart[27].decay[4].pID[1] = getPid ("D+");
decPart[27].decay[4].pID[2] = getPid ("pi0_");
decPart[27].decay[5].prong = 2;
decPart[27].decay[5].pID[1] = getPid ("D++");
decPart[27].decay[5].pID[2] = getPid ("pi-");
decPart[27].decay[6].prong = 2;
decPart[27].decay[6].pID[1] = getPid ("D0");
decPart[27].decay[6].pID[2] = getPid ("pi+");
decPart[27].decay[7].prong = 2;
decPart[27].decay[7].pID[1] = getPid ("p");
decPart[27].decay[7].pID[2] = getPid ("rho0");
decPart[27].decay[8].prong = 2;
decPart[27].decay[8].pID[1] = getPid ("n");
decPart[27].decay[8].pID[2] = getPid ("rho+");
decPart[28].pID = getPid ("NS11+");
decPart[28].cTau = 0.001;
decPart[28].decaysNmb = 9;
decPart[28].decay[1].prong = 2;
decPart[28].decay[1].pID[1] = getPid ("p");
decPart[28].decay[1].pID[2] = getPid ("pi0_");
decPart[28].decay[2].prong = 2;
decPart[28].decay[2].pID[1] = getPid ("n");
decPart[28].decay[2].pID[2] = getPid ("pi+");
decPart[28].decay[3].prong = 3;
decPart[28].decay[3].pID[1] = getPid ("p");
decPart[28].decay[3].pID[2] = getPid ("pi+");
decPart[28].decay[3].pID[3] = getPid ("pi-");
decPart[28].decay[4].prong = 2;
decPart[28].decay[4].pID[1] = getPid ("D+");
decPart[28].decay[4].pID[2] = getPid ("pi0_");
decPart[28].decay[5].prong = 2;
decPart[28].decay[5].pID[1] = getPid ("D++");
decPart[28].decay[5].pID[2] = getPid ("pi-");
decPart[28].decay[6].prong = 2;
decPart[28].decay[6].pID[1] = getPid ("D0");
decPart[28].decay[6].pID[2] = getPid ("pi+");
decPart[28].decay[7].prong = 2;
decPart[28].decay[7].pID[1] = getPid ("p");
decPart[28].decay[7].pID[2] = getPid ("rho0");
decPart[28].decay[8].prong = 2;
decPart[28].decay[8].pID[1] = getPid ("n");
decPart[28].decay[8].pID[2] = getPid ("rho+");
decPart[28].decay[9].prong = 2;
decPart[28].decay[9].pID[1] = getPid ("p");
decPart[28].decay[9].pID[2] = getPid ("eta");
}
Bool_t HChannelListMaker::newChannelFound (Double_t newCodeOut)
{Bool_t result;
Int_t k;
result = true;
for (k = 1; k <= num; k++) if (newCodeOut == chList[idx].ch[k].code) result = false;
return result;
}
void HChannelListMaker::sortDigit (Int_t n, Int_t* A)
{Int_t i,j,t;
for (i = n-1; i >= 1; i--)
for (j = 1; j <= i; j++)
if (A[j] > A[j+1]) {t = A[j]; A[j] = A[j+1]; A[j+1] = t;}
}
void HChannelListMaker::addNewChannel (Int_t prong, Int_t* digit, Double_t newCodeOut,
tChannelType channelType, Float_t massSum, FILE* otp)
{Int_t i;
num++;
chList[idx].chNmb = num;
chList[idx].ch[num].channelType = channelType;
chList[idx].ch[num].prong = prong;
chList[idx].ch[num].code = newCodeOut;
for (i = 1; i <= prong; i++) chList[idx].ch[num].pID[i] = digit[i];
if (channelType == neutral) chList[idx].ch[num].pID[prong+1] = neutralIndex;
Int_t j;
fprintf (otp,"%6i %7.3f -> ",num,massSum);
for (i = 1; i <= prong; i++)
{fprintf (otp,"%s",Phys.P[ndex[i]].name);
for (j = 1; j <= int(nameLength-strlen(Phys.P[ndex[i]].name)); j++) fprintf (otp," ");
}
switch (channelType)
{case charged: for (j = 1; j <= int(nameLength); j++) fprintf (otp," "); break;
case neutral: fprintf (otp,"%s",Phys.P[neutralIndex].name);
for (j = 1; j <= int(nameLength-strlen(Phys.P[neutralIndex].name)); j++)
fprintf (otp," ");
break;
}
fprintf (otp,"\n");
}
void HChannelListMaker::copyChString (Int_t idxFrom, Int_t chNFrom, Int_t idxTo, Int_t chNTo)
{Int_t maxP,k;
maxP = chList[idxFrom].ch[chNFrom].prong;
chList[idxTo].ch[chNTo].prong = maxP;
for (k = 1; k <= maxP; k++)
chList[idxTo].ch[chNTo].pID[k] = chList[idxFrom].ch[chNFrom].pID[k];
}
void HChannelListMaker::printChString (const Char_t* marker, Int_t idx, Int_t chN, FILE* otp)
{Int_t k;
fprintf (otp,"%3i: %s ",chN,marker);
for (k = 1; k <= chList[idx].ch[chN].prong; k++)
fprintf (otp," %s",Phys.P[chList[idx].ch[chN].pID[k]].name);
fprintf (otp,"\n");
}
void HChannelListMaker::typeChString (const Char_t* marker, Int_t idx, Int_t chN)
{Int_t k;
printf ("%3i: %s ",chN,marker);
for (k = 1; k <= chList[idx].ch[chN].prong; k++)
printf (" %s",Phys.P[chList[idx].ch[chN].pID[k]].name);
printf ("\n");
}
void HChannelListMaker::shiftParticleToEnde (Int_t idxNew, Int_t newChN, Int_t pos)
{Int_t i,j,pid,prong;
j = 0;
pid = chList[idxNew].ch[newChN].pID[pos];
prong = chList[idxNew].ch[newChN].prong;
for (i = 1; i <= chList[idxNew].ch[newChN].prong; i++)
if (i != pos)
{j++;
chList[idxNew].ch[newChN].pID[j] = chList[idxNew].ch[newChN].pID[i];
}
chList[idxNew].ch[newChN].pID[prong] = pid;
}
void HChannelListMaker::printChannelCodes (Int_t idx, Int_t chN, FILE* otp)
{
Int_t k,maxP;
fprintf (otp,"%3i: %18.0f -> ",chN,chList[idx].ch[chN].code);
maxP = chList[idx].ch[chN].prong;
for (k = 1; k <= maxP; k++)
fprintf (otp," %s",Phys.P[chList[idx].ch[chN].pID[k]].name);
if (chList[idx].ch[chN].channelType == neutral)
{fprintf (otp," %s",Phys.P[chList[idx].ch[chN].pID[maxP+1]].name);
if (Phys.P[chList[idx].ch[chN].pID[maxP+1]].charge != 0) fprintf (otp,"'");
}
fprintf (otp,"\n");
}
void HChannelListMaker::printChannelList (Int_t idx, FILE* otp)
{
Int_t i;
if (chList[idx].chNmb > 0)
for (i = 1; i <= chList[idx].chNmb; i++) printChannelCodes (idx,i,otp);
else
{
fprintf (otp,"channel list %i is empty\n",idx);
printf ( "channel list %i is empty\n",idx);
}
}
void HChannelListMaker::typeChannelCodes (Int_t idx, Int_t chN)
{Int_t k,maxP;
printf ("%3i: %18.0f -> ",chN,chList[idx].ch[chN].code);
maxP = chList[idx].ch[chN].prong;
for (k = 1; k <= maxP; k++)
printf (" %s",Phys.P[chList[idx].ch[chN].pID[k]].name);
if (chList[idx].ch[chN].channelType == neutral)
{printf (" %s",Phys.P[chList[idx].ch[chN].pID[maxP+1]].name);
if (Phys.P[chList[idx].ch[chN].pID[maxP+1]].charge != 0) printf ("'");
}
printf ("\n");
}
void HChannelListMaker::typeChannelList (Int_t idx)
{Int_t i;
if (chList[idx].chNmb > 0)
for (i = 1; i <= chList[idx].chNmb; i++) typeChannelCodes (idx,i);
else
{
printf ( "channel list %i is empty\n",idx);
}
}
void HChannelListMaker::copyChannel (tChannel* chFrom, tChannel* chTo)
{Int_t maxP,i;
maxP = chFrom->prong;
if (chFrom->channelType == neutral) maxP++;
for (i = 1; i <= maxP; i++) chTo->pID[i] = chFrom->pID[i];
chTo->channelType = chFrom->channelType;
chTo->prong = chFrom->prong;
chTo->code = chFrom->code;
}
Bool_t HChannelListMaker::validParticle (Int_t pid)
{Bool_t result;
result = kTRUE;
if (strcoll(Phys.P[pid].name,"TC" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"pion" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"d" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"t" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"alpha") == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"kaon" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"He3" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"dimu" ) == 0) result = kFALSE;
else if (strcoll(Phys.P[pid].name,"dilep") == 0) result = kFALSE;
return result;
}
Int_t HChannelListMaker::getNextCharged (Int_t pid)
{Int_t result,pidTemp;
Bool_t endFlag;
result = 0;
endFlag = kFALSE;
pidTemp = pid;
while (!endFlag)
if (pidTemp < Phys.particles)
{pidTemp++;
if (Phys.P[pidTemp].charge != 0)
{result = pidTemp;
endFlag = kTRUE;
}
}
else endFlag = kTRUE;
return result;
}
void HChannelListMaker::addPart (Int_t partIndex, Int_t* dim, Int_t* pidList)
{Bool_t found;
Int_t i;
found = kFALSE;
i = 0;
while (!found && (i < *dim))
{if (partIndex == pidList[i]) found = kTRUE;
i++;
}
if (!found)
{pidList[*dim] = partIndex; (*dim)++;
}
}
Double_t HChannelListMaker::getChannelCode (Int_t prong, Int_t* digit, Int_t missaPid)
{
Int_t tNo;
Double_t chC;
chC = 0;
for (tNo = 1; tNo <= prong; tNo++) chC = (chC + digit[tNo])*codeMul;
if (missaPid != 0) chC = chC + missaPid;
return chC;
}
Int_t HChannelListMaker::getMissaPid (Double_t chCode)
{return (int)(chCode - ((int)(chCode/codeMul))*codeMul);
}
Bool_t HChannelListMaker::makeChannelList
(Int_t maxProng, Int_t beamN, Float_t Ek, Int_t targN,
Float_t regDist, Bool_t allChargedParticlesAreRegistered,
Int_t maxChNmb, Int_t* numberOfChannels, Double_t* chCodeList, TString* chLineList,
Int_t* pNmb, Int_t* posPID, Int_t* nNmb, Int_t* negPID, Int_t* tNmb, Int_t* totPID)
{
const Float_t dm = 0.0005;
const Float_t me = 0.000511;
const Float_t mmu = 0.105658;
Float_t dme,dmmu;
Float_t mb,Eb,pb,mt,Et,pt,ms,Es,ps;
Float_t gamma,beta,EbCMS,EtCMS,ECMS;
Int_t chargeIn ,leptonIn ,baryonIn ,strangeIn;
Int_t lepton,chargeOut,leptonOut,baryonOut,strangeOut;
Int_t leptonNeu,baryonNeu,strangeNeu;
Int_t electron,muon;
Float_t mass,massOut,massNeu;
Int_t i,pid,posNum,nextChargedPid,initialChargedPid;
Bool_t enough,prongCharged,newCombFound,result;
Int_t digit[limProng];
Int_t tempLength,fullLength;
Int_t gsiPid[max_particles];
FILE* otp;
const Char_t* chListMaker_file_name = "channelListMaker.txt";
result = kTRUE;
if ( (otp = fopen (chListMaker_file_name, "wt")) == NULL )
{fprintf (stderr,"'%s' open file error \n",chListMaker_file_name); result = kFALSE;}
else
{
bLib.fillPhysCnst(&Phys,otp);
fullLength = Phys.particles;
fprintf (otp,"Full GSI particle list:\n");
bLib.prntPhys (&Phys,otp);
tempLength = 0;
for (pid = 1; pid <= fullLength; pid++)
if (validParticle(pid))
{tempLength++;
sprintf (Phys.P[tempLength].name,"%s", Phys.P[pid].name);
Phys.P[tempLength].mass = Phys.P[pid].mass;
Phys.P[tempLength].charge = Phys.P[pid].charge;
Phys.P[tempLength].leptonCharge = Phys.P[pid].leptonCharge;
Phys.P[tempLength].baryonCharge = Phys.P[pid].baryonCharge;
Phys.P[tempLength].strange = Phys.P[pid].strange;
gsiPid[tempLength] = pid;
}
Phys.particles = tempLength;
fprintf (otp,"Particle in use list:\n");
bLib.prntPhys (&Phys,otp);
fprintf (otp,"GSI pid's list\n");
for (pid = 1; pid <= Phys.particles; pid++)
{
fprintf (otp,"%3i gsiPid %2i '%s'\n",pid,gsiPid[pid],Phys.P[pid].name);
}
fprintf (otp,"\n");
mb = HBPidPhysicsConstants::mass(beamN)/1000.0;
Eb = Ek + mb;
pb = sqrt(sqr(Eb) - sqr(mb));
mt = HBPidPhysicsConstants::mass(targN)/1000.0;
Et = mt;
pt = 0;
ps = pb;
Es = Eb + Et;
ms = sqrt(sqr(mb) + sqr(mt) + 2*Eb*mt);
gamma = Es/ms;
beta = ps/Es;
EbCMS = gamma*(Eb - beta*pb);
EtCMS = gamma*(Et - beta*pt);
ECMS = EbCMS + EtCMS;
chargeIn = HBPidPhysicsConstants::charge (beamN) + HBPidPhysicsConstants::charge (targN);
leptonIn = HBPidPhysicsConstants::leptonCharge(beamN) + HBPidPhysicsConstants::leptonCharge(targN);
baryonIn = HBPidPhysicsConstants::baryonCharge(beamN) + HBPidPhysicsConstants::baryonCharge(targN);
strangeIn = HBPidPhysicsConstants::strangeness (beamN) + HBPidPhysicsConstants::strangeness (targN);
fprintf (otp,"Collision: %s %s ->\n",
HBPidPhysicsConstants::pid(beamN),HBPidPhysicsConstants::pid(targN));
fprintf (otp,"beam particle '%s', mass %f\n",HBPidPhysicsConstants::pid(beamN),mb);
fprintf (otp,"target particle '%s', mass %f\n",HBPidPhysicsConstants::pid(targN),mt);
fprintf (otp,"Beam kinetic energy %f (GeV)\n",Ek);
fprintf (otp,"Beam momentum %f (GeV/c)\n",pb);
fprintf (otp,"CMS system energy %f (GeV)\n",ECMS);
fprintf (otp,"System electricity charge %i\n",chargeIn);
fprintf (otp,"System lepton charge %i\n",leptonIn);
fprintf (otp,"System baryon charge %i\n",baryonIn);
fprintf (otp,"System strange %i\n",strangeIn);
fprintf (otp,"\nChannels possible in vertex:\n");
num = 0;
idx = 0;
chList[idx].chNmb = 0;
for (prong = 1; prong <= maxProng; prong++)
{fprintf (otp," multiplicity %i\n",prong);
if (chargeIn > 0) posNum = (prong + 2)/2;
else if (chargeIn == 0) posNum = (prong )/2;
else posNum = (prong - 1)/2;
if ( (prong%2) == (abs(chargeIn)%2) )
{fprintf (otp," positive particles %i\n",posNum);
initialChargedPid = getNextCharged (0);
if (initialChargedPid <= 0) {printf ("no charged particles found\n"); abort ();}
for (i = 1; i <= prong; i++) ndex[i] = initialChargedPid;
enough = false;
while (!enough)
{chargeOut = 0;
for (i = 1; i <= prong; i++)
chargeOut = chargeOut + Phys.P[ndex[i]].charge;
if (chargeIn == chargeOut)
{leptonOut = 0;
baryonOut = 0;
strangeOut = 0;
electron = 0;
muon = 0;
massOut = 0;
prongCharged = true;
i = 1;
while ( prongCharged && (i <= prong) )
if ( ( (i <= posNum) && (Phys.P[ndex[i]].charge > 0) ) ||
( (i > posNum) && (Phys.P[ndex[i]].charge < 0) ) )
{
lepton = Phys.P[ndex[i]].leptonCharge;
mass = Phys.P[ndex[i]].mass;
leptonOut = leptonOut + lepton;
baryonOut = baryonOut + Phys.P[ndex[i]].baryonCharge;
strangeOut = strangeOut + Phys.P[ndex[i]].strange;
massOut = massOut + mass;
if (lepton != 0)
{dme = fabs(mass - me);
dmmu = fabs(mass - mmu);
if (lepton > 0)
{if (dme < dm) electron++;
else if (dmmu < dm) muon++;
}
else if (lepton < 0)
{if (dme < dm) electron--;
else if (dmmu < dm) muon--;
}
}
i++;
}
else prongCharged = false;
if (prongCharged && (electron == 0) && (muon == 0))
{for (i = 1; i <= prong; i++) digit[i] = ndex[i];
sortDigit (prong,digit);
newCode = getChannelCode (prong,digit,0);
if ( (leptonIn == leptonOut) &&
(baryonIn == baryonOut) &&
(strangeIn == strangeOut) &&
(ECMS >= massOut) )
if (newChannelFound(newCode)) addNewChannel (prong,digit,newCode,charged,massOut,otp);
for (neutralIndex = 1; neutralIndex <= Phys.particles; neutralIndex++)
if (Phys.P[neutralIndex].charge == 0)
{
leptonNeu = leptonOut + Phys.P[neutralIndex].leptonCharge;
baryonNeu = baryonOut + Phys.P[neutralIndex].baryonCharge;
strangeNeu = strangeOut + Phys.P[neutralIndex].strange;
massNeu = massOut + Phys.P[neutralIndex].mass;
if ( (leptonIn == leptonNeu) &&
(baryonIn == baryonNeu) &&
(strangeIn == strangeNeu) &&
(ECMS >= massNeu) )
{newCodeOut = newCode + neutralIndex;
if (newChannelFound(newCodeOut)) addNewChannel (prong,digit,newCodeOut,neutral,massNeu,otp);
}
}
}
}
i = prong; newCombFound = kFALSE;
while ( (i > 0) && !newCombFound )
{nextChargedPid = getNextCharged (ndex[i]);
if (nextChargedPid != 0)
{ndex[i] = nextChargedPid; newCombFound = kTRUE;
}
else
if (i > 1) {ndex[i] = initialChargedPid; i--;}
else {newCombFound = kTRUE; enough = true;}
}
}
fprintf (otp,"--------\n");
}
else {fprintf (otp," charge violation\n");
}
}
fprintf (otp,"--------\n");
fprintf (otp,"\nPrimary possible channels (codes):\n");
printChannelList (idx,otp);
fprintf (otp,"temporary adding 'stable pi0' to particle list:\n");
Int_t pi0Pos,pi0StablePos;
Phys.particles++;
pi0StablePos = Phys.particles;
pi0Pos = getPid ("pi0");
sprintf (Phys.P[pi0StablePos].name,"%s%s",Phys.P[pi0Pos].name,"_");
Phys.P[pi0StablePos].charge = Phys.P[pi0Pos].charge;
fprintf (otp,"\nParticle with pi0_ table:\n");
bLib.prntPhys (&Phys,otp);
getDecayList ();
Bool_t allChanged,foundDecayed,foundAtLeastOnce,overFlow;
Int_t mal,kk,ll,prongNew,chN,newChN,dpN,nd,pID,maxP,neutraNmb,replN;
fprintf (otp,"\nreplacing Short_t life time particles with stable ones:\n");
for (chN = 1; chN <= chList[idx].chNmb; chN++)
if (chList[idx].ch[chN].channelType == neutral) chList[idx].ch[chN].prong++;
allChanged = false;
idxNew = 1 - idx;
mal = 0;
while (!allChanged)
{foundAtLeastOnce = false; newChN = 0;
for (chN = 1; chN <= chList[idx].chNmb; chN++)
{
fprintf (otp,"\n");
printChString ("==",idx,chN,otp);
replN = 0; foundDecayed = false; dpN = 0;
maxP = chList[idx].ch[chN].prong;
while (!foundDecayed && (replN < maxP))
{replN++; pID = chList[idx].ch[chN].pID[replN];
dpN = 0;
while (!foundDecayed && (dpN < decPartsNmb))
{dpN++;
if ((decPart[dpN].pID == pID) && (decPart[dpN].cTau < regDist))
foundDecayed = true;
}
}
if (foundDecayed)
{foundAtLeastOnce = true;
for (nd = 1; nd <= decPart[dpN].decaysNmb; nd++)
if (newChN < chNmbMaxTmp)
{
newChN++;
prongNew = replN - 1;
for (kk = 1; kk <= prongNew; kk++)
chList[idxNew].ch[newChN].pID[kk] = chList[idx].ch[chN].pID[kk];
ll = 0;
overFlow = false;
while (!overFlow && (ll < decPart[dpN].decay[nd].prong))
{if (prongNew <= maxProng)
{prongNew++; ll++;
pID = decPart[dpN].decay[nd].pID[ll];
chList[idxNew].ch[newChN].pID[prongNew] = pID;
}
else overFlow = true;
}
if (!overFlow)
{kk = replN;
while (!overFlow && kk < maxP)
{if (prongNew <= maxProng)
{prongNew++; kk++;
pID = chList[idx].ch[chN].pID[kk];
chList[idxNew].ch[newChN].pID[prongNew] = pID;
}
else overFlow = true;
}
if (!overFlow)
{chList[idxNew].ch[newChN].prong = prongNew;
printChString ("->",idxNew,newChN,otp);
}
else newChN--;
}
else newChN--;
}
else
{printf ( "HChannelListMaker: Number of new channels > limit %i\n",chNmbMaxTmp);
fclose (otp);
allChanged = kTRUE;
return kFALSE;
}
}
else
if (newChN < chNmbMaxTmp)
{newChN++;
copyChString (idx,chN,idxNew,newChN);
printChString ("::",idxNew,newChN,otp);
}
else
{printf ( "HChannelListMaker: Number of new channels became > limit %i\n",chNmbMaxTmp);
fclose (otp);
allChanged = kTRUE;
return kFALSE;
}
chList[idxNew].chNmb = newChN;
}
idx = 1 - idx;
idxNew = 1 - idxNew;
if (foundAtLeastOnce)
{mal++;
fprintf (otp,"\n #%i replacing of Short_t life time particles with decay products:\n",mal);
}
else allChanged = kTRUE;
}
fprintf (otp,"\nreplacing pi0_ with pi0:\n");
Bool_t replacedFound;
newChN = 0;
for (chN = 1; chN <= chList[idx].chNmb; chN++)
{
fprintf (otp,"\n");
printChString ("==",idx,chN,otp);
newChN++;
replacedFound = false;
for (replN = 1; replN <= chList[idx].ch[chN].prong; replN++)
{pID = chList[idx].ch[chN].pID[replN];
if (pID == pi0StablePos) {pID = pi0Pos; replacedFound = true;}
chList[idxNew].ch[newChN].pID[replN] = pID;
}
if (replacedFound)
{
printChString ("->",idxNew,newChN,otp);
}
else
{
printChString ("::",idxNew,newChN,otp);
}
}
chList[idxNew].chNmb = chList[idx].chNmb;
idx = 1 - idx;
idxNew = 1 - idxNew;
fprintf (otp,"deleting pi0_ from particle in use list:\n");
Phys.particles--;
Int_t neutraPos,neutraPID;
fprintf (otp,"\nextracting multiNeutra and single-particle channels, \n");
if (!allChargedParticlesAreRegistered)
{fprintf (otp,"producing not registered charge particle channels\n");
}
newChN = 0;
for (chN = 1; chN <= chList[idx].chNmb; chN++)
{neutraNmb = 0;
neutraPos = 0; neutraPID = 0;
fprintf (otp,"\n");
printChString ("==",idx,chN,otp);
if (chList[idx].ch[chN].prong > 1)
{
for (i = 1; i <= chList[idx].ch[chN].prong; i++)
if (Phys.P[chList[idx].ch[chN].pID[i]].charge == 0)
{neutraNmb++; neutraPos = i; neutraPID = chList[idx].ch[chN].pID[neutraPos];}
if (neutraNmb <= 1)
{
if (neutraNmb == 0)
{
sortDigit (chList[idx].ch[chN].prong,chList[idx].ch[chN].pID);
if (chList[idx].ch[chN].prong <= maxProng)
{
newChN++;
copyChString (idx,chN,idxNew,newChN);
printChString ("::",idxNew,newChN,otp);
chList[idxNew].ch[newChN].channelType = charged;
chList[idxNew].ch[newChN].code = getChannelCode (chList[idxNew].ch[newChN].prong,chList[idxNew].ch[newChN].pID,0);
printChannelCodes (idxNew,newChN,otp);
}
if (!allChargedParticlesAreRegistered)
{fprintf (otp,"producing charge-missing channels...\n");
Int_t beforeNonReg,nonRegPos;
beforeNonReg = 0;
for (i = 1; i <= chList[idx].ch[chN].prong; i++)
{pID = chList[idx].ch[chN].pID[i];
if (pID != beforeNonReg)
{beforeNonReg = pID; nonRegPos = i;
newChN++;
chList[idxNew].ch[newChN].channelType = neutral;
copyChString (idx ,chN ,idxNew,newChN);
shiftParticleToEnde (idxNew,newChN,nonRegPos);
chList[idxNew].ch[newChN].prong--;
chList[idxNew].ch[newChN].code =
getChannelCode (chList[idxNew].ch[newChN].prong,chList[idxNew].ch[newChN].pID,pID);
printChannelCodes (idxNew,newChN,otp);
}
}
}
}
else
{
newChN++;
copyChString (idx,chN,idxNew,newChN);
printChString ("::",idxNew,newChN,otp);
chList[idxNew].ch[newChN].channelType = neutral;
shiftParticleToEnde (idxNew,newChN,neutraPos);
chList[idxNew].ch[newChN].prong--;
sortDigit (chList[idxNew].ch[newChN].prong,chList[idxNew].ch[newChN].pID);
chList[idxNew].ch[newChN].code =
getChannelCode (chList[idxNew].ch[newChN].prong,chList[idxNew].ch[newChN].pID,neutraPID);
printChannelCodes (idxNew,newChN,otp);
}
}
else
{
fprintf (otp,"extracting multi-missing channel...\n");
}
}
else
{
fprintf (otp,"extracting single-particle channel...\n");
}
}
chList[idxNew].chNmb = newChN;
idx = 1 - idx;
idxNew = 1 - idxNew;
fprintf (otp,"\nUnsorted channels:\n");
printChannelList (idx,otp);
Bool_t wasReplacing;
Int_t K0Spos,K0Lpos;
fprintf (otp,"Attepmt of replacing K0S (if exists) with K0L:\n");
K0Spos = getPid ("K0S");
K0Lpos = getPid ("K0L");
wasReplacing = false;
for (chN = 1; chN <= chList[idx].chNmb; chN++)
{copyChannel (&chList[idx].ch[chN],&chList[idxNew].ch[chN]);
if (chList[idx].ch[chN].channelType == neutral)
{prong = chList[idx].ch[chN].prong;
neutraPID = chList[idx].ch[chN].pID[prong+1];
if (neutraPID == K0Spos)
{chList[idxNew].ch[chN].pID[prong+1] = K0Lpos;
chList[idxNew].ch[chN].code = (chList[idx].ch[chN].code - K0Spos) + K0Lpos;
wasReplacing = true;
}
}
}
chList[idxNew].chNmb = chList[idx].chNmb;
idx = 1 - idx;
idxNew = 1 - idxNew;
if (wasReplacing)
{
fprintf (otp,"\nChannels with K0S replaced with K0L:\n");
printChannelList (idx,otp);
}
else fprintf (otp,"there were no K0S for replacing\n");
Int_t j;
tChannel chTemp;
for (i = chList[idx].chNmb-1; i >= 1; i--)
for (j = 1; j <= i; j++)
if (chList[idx].ch[j].code > chList[idx].ch[j+1].code)
{copyChannel (&chList[idx].ch[j+1],&chTemp);
copyChannel (&chList[idx].ch[j ],&chList[idx].ch[j+1]);
copyChannel (&chTemp ,&chList[idx].ch[j ]);
}
fprintf (otp,"\nSorted channels:\n");
printChannelList (idx,otp);
fprintf (otp,"Deleting duplicate channels:\n");
Double_t oldCode;
newChN = 0; oldCode = 0.0;
for (chN = 1; chN <= chList[idx].chNmb; chN++)
if (chList[idx].ch[chN].code != oldCode)
{newChN++; oldCode = chList[idx].ch[chN].code;
copyChannel (&chList[idx].ch[chN],&chList[idxNew].ch[newChN]);
}
chList[idxNew].chNmb = newChN;
idx = 1 - idx;
idxNew = 1 - idxNew;
fprintf (otp,"\nChannels with internal pid's:\n");
printChannelList (idx,otp);
fprintf (otp,"Replacing pid's with GSI ones...\n");
bLib.fillPhysCnst(&Phys,otp);
for (chN = 1; chN <= chList[idx].chNmb; chN++)
{chList[idxNew].ch[chN].channelType = chList[idx].ch[chN].channelType;
prong = chList[idx].ch[chN].prong;
chList[idxNew].ch[chN].prong = prong;
for (i = 1; i <= prong; i++)
chList[idxNew].ch[chN].pID[i] = gsiPid[chList[idx].ch[chN].pID[i]];
if (chList[idx].ch[chN].channelType == neutral)
neutraPID = gsiPid[chList[idx].ch[chN].pID[prong+1]];
else neutraPID = 0;
chList[idxNew].ch[chN].pID[prong+1] = neutraPID;
chList[idxNew].ch[chN].code =
getChannelCode (chList[idxNew].ch[chN].prong,chList[idxNew].ch[chN].pID,neutraPID);
}
chList[idxNew].chNmb = chList[idx].chNmb;
idx = 1 - idx;
idxNew = 1 - idxNew;
fprintf (otp,"\nChannels:\n");
printChannelList (idx,otp);
if (chList[idx].chNmb <= maxChNmb)
{
*numberOfChannels = 0;
*pNmb = 0;
*nNmb = 0;
*tNmb = 0;
for (chN = 1; chN <= chList[idx].chNmb; chN++)
{(*numberOfChannels)++;
chCodeList[*numberOfChannels]= chList[idx].ch[chN].code;
maxP = chList[idx].ch[chN].prong;
chLineList[*numberOfChannels] = "";
for (i = 1; i <= maxP; i++)
{pID = chList[idx].ch[chN].pID[i];
chLineList[*numberOfChannels] = chLineList[*numberOfChannels] + Phys.P[pID].name + " ";
if (Phys.P[pID].charge > 0) addPart (pID,pNmb,posPID);
else if (Phys.P[pID].charge < 0) addPart (pID,nNmb,negPID);
addPart (pID,tNmb,totPID);
}
if (chList[idx].ch[chN].channelType == neutral)
{pID = chList[idx].ch[chN].pID[maxP+1];
chLineList[*numberOfChannels] = chLineList[*numberOfChannels] + Phys.P[pID].name;
if (Phys.P[pID].charge != 0) chLineList[*numberOfChannels] = chLineList[*numberOfChannels] + "'";
if (Phys.P[pID].charge > 0) addPart (pID,pNmb,posPID);
else if (Phys.P[pID].charge < 0) addPart (pID,nNmb,negPID);
addPart (pID,tNmb,totPID);
}
}
fprintf (otp,"%2i positive particles in use: ",*pNmb);
for (i = 0; i < *pNmb; i++)
fprintf (otp," %s",Phys.P[posPID[i]].name);
fprintf (otp,"\n");
fprintf (otp,"%2i negative particles in use: ",*nNmb);
for (i = 0; i < *nNmb; i++)
fprintf (otp," %s",Phys.P[negPID[i]].name);
fprintf (otp,"\n");
fprintf (otp,"%2i total particles in use: ",*tNmb);
for (i = 0; i < *tNmb; i++)
fprintf (otp," %s",Phys.P[totPID[i]].name);
fprintf (otp,"\n");
printf ("%2i positive particles in use: ",*pNmb);
for (i = 0; i < *pNmb; i++)
printf (" %s",Phys.P[posPID[i]].name);
printf ("\n");
printf ("%2i negative particles in use: ",*nNmb);
for (i = 0; i < *nNmb; i++)
printf (" %s",Phys.P[negPID[i]].name);
printf ("\n");
printf ("%2i total particles in use: ",*tNmb);
for (i = 0; i < *tNmb; i++)
printf (" %s",Phys.P[totPID[i]].name);
printf ("\n");
}
else
{*numberOfChannels = chList[idx].chNmb;
printf ("hChannelListMaker: number of channel produced (%i) > capacity (%i) of calling program\n",chList[idx].chNmb,maxChNmb);
result = kFALSE;
}
fclose (otp);
}
return result;
}
Last change: Sat May 22 12:53:48 2010
Last generated: 2010-05-22 12:53
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.