00001 #include "CandNtupleSR/NtpSREvent.h"
00002 #include "StandardNtuple/NtpStRecord.h"
00003 #include "MCNtuple/NtpMCTruth.h"
00004 #include "MCNtuple/NtpMCStdHep.h"
00005 #include "TruthHelperNtuple/NtpTHEvent.h"
00006 #include "MessageService/MsgService.h"
00007 #include "StdHepInfoAna.h"
00008 #include "AnalysisNtuples/Module/ANtpRecoNtpManipulator.h"
00009 #include "AnalysisNtuples/ANtpDefaultValue.h"
00010
00011 CVSID("$Id: StdHepInfoAna.cxx,v 1.16 2009/02/12 04:58:55 tjyang Exp $");
00012
00013 void CalcDaughters(int start, int end, double &E, double &EmE, int &npi0, int &nch, int &ntot, TClonesArray& stdhepArray);
00014 void HughCode(NtpMCTruth* mctruth, TClonesArray& stdhepArray, StdHepInfo &shi);
00015
00016
00017 StdHepInfoAna::StdHepInfoAna(StdHepInfo &shi):
00018 fStdHepInfo(shi)
00019 {}
00020
00021 StdHepInfoAna::~StdHepInfoAna()
00022 {}
00023
00024 bool isLeptonic(int parent, TClonesArray& stdhepArray);
00025 bool checkParent(int parent, TClonesArray& stdhepArray);
00026 void countpi0(int index, TClonesArray& stdhepArray, StdHepInfo &fStdHepInfo);
00027 void calbaryonpt(int index, TClonesArray& stdhepArray, StdHepInfo &fStdHepInfo);
00028
00029 void StdHepInfoAna::Analyze(int event, RecRecordImp<RecCandHeader> *srobj)
00030 {
00031 if(srobj==0){
00032 return;
00033 }
00034 NtpStRecord *st = dynamic_cast<NtpStRecord *>(srobj);
00035 Analyze(event,st);
00036 }
00037
00038 void StdHepInfoAna::Analyze(int evtn, NtpStRecord *srobj)
00039 {
00040 fStdHepInfo.Reset();
00041 if(srobj==0){
00042 return;
00043 }
00044 NtpMCTruth *mctruth = 0;
00045 NtpMCStdHep *ntpStdHep = 0;
00046 NtpTHEvent *thevent = 0;
00047 ANtpRecoNtpManipulator ntpManipulator(srobj);
00048 thevent = ntpManipulator.GetMCManipulator()->GetNtpTHEvent(evtn);
00049 if(thevent){
00050 mctruth = ntpManipulator.GetMCManipulator()->GetNtpMCTruth(thevent->neumc);
00051 if(mctruth){
00052 fStdHepInfo.Zero();
00053 TClonesArray& stdhepArray = *(srobj->stdhep);
00054 Int_t nStdHep = stdhepArray.GetEntries();
00055 HughCode(mctruth, stdhepArray, fStdHepInfo);
00056 Double_t maxmom = 0;
00057 Double_t maxke = 0;
00058 Double_t lepmaxmom = 0;
00059 Double_t lepmaxke = 0;
00060 Double_t initialNuEnergy=0;
00061
00062 countpi0(mctruth->index,stdhepArray,fStdHepInfo);
00063
00064 calbaryonpt(mctruth->index,stdhepArray,fStdHepInfo);
00065 if (mctruth->w2>0) fStdHepInfo.baryonxf *= 2./sqrt(mctruth->w2);
00066
00067 for(int i=mctruth->stdhep[0];i<=mctruth->stdhep[1]&&i<nStdHep;i++){
00068 ntpStdHep = dynamic_cast<NtpMCStdHep *>(stdhepArray[i]);
00069
00070
00071 if(ntpStdHep->mc==mctruth->index &&ntpStdHep->IstHEP==0&& (abs(ntpStdHep->IdHEP)==12 || abs(ntpStdHep->IdHEP)==14 || abs(ntpStdHep->IdHEP)==16)){
00072 initialNuEnergy=TMath::Abs(ntpStdHep->p4[3]);
00073
00074 }
00075
00076
00077
00078
00079
00080 if(ntpStdHep->mc==mctruth->index && abs(ntpStdHep->IdHEP)!=12 &&
00081 abs(ntpStdHep->IdHEP)!=14 && abs(ntpStdHep->IdHEP)!=16){
00082
00083 if(ntpStdHep->IstHEP==3 &&
00084 (mctruth->iresonance!=1002 ||
00085 TMath::Abs(ntpStdHep->IdHEP)!=15)){
00086 Int_t hfs = ntpStdHep->IdHEP%1000;
00087 fStdHepInfo.nmult = Int_t((hfs-128)/4)-20;
00088 }
00089
00090
00091
00092
00093
00094
00095 else if(ntpStdHep->IstHEP==205){
00096
00097 if(abs(ntpStdHep->IdHEP)==11||abs(ntpStdHep->IdHEP)==22||abs(ntpStdHep->IdHEP)==111){
00098 Double_t energy = TMath::Abs(ntpStdHep->p4[3]);
00099 if(!checkParent(ntpStdHep->parent[0],stdhepArray)){
00100 if(ntpStdHep->parent[0]!=ntpStdHep->parent[1]){
00101 if(!checkParent(ntpStdHep->parent[1],stdhepArray)){
00102 fStdHepInfo.emenergy+=energy;
00103 fStdHepInfo.emcount++;
00104 }
00105 }else{
00106 fStdHepInfo.emenergy+=energy;
00107 fStdHepInfo.emcount++;
00108 }
00109 }
00110 }
00111 }
00112
00113
00114
00115
00116
00117 else if((ntpStdHep->IstHEP==1 ) &&
00118 ntpStdHep->IdHEP<1000000000){
00119 Double_t energy = TMath::Abs(ntpStdHep->p4[3]);
00120 Double_t pz = TMath::Abs(ntpStdHep->p4[2]);
00121 Double_t pt = ( ntpStdHep->p4[0]*ntpStdHep->p4[0] +
00122 ntpStdHep->p4[1]*ntpStdHep->p4[1] );
00123 Double_t mom = TMath::Sqrt(pz*pz + pt);
00124 Double_t ke = energy - ntpStdHep->mass;
00125
00126 if(mom>maxmom) maxmom = mom;
00127 if(ke>maxke) maxke = ke;
00128 if(ke>0.5) fStdHepInfo.nfs_he += 1;
00129
00130 fStdHepInfo.nfs += 1;
00131 fStdHepInfo.etot += energy;
00132 fStdHepInfo.pztot += pz;
00133 fStdHepInfo.pttot += pt;
00134 fStdHepInfo.wfs += ke;
00135
00136
00137
00138
00139
00140
00141 if(abs(ntpStdHep->IdHEP)==11||abs(ntpStdHep->IdHEP)==22||abs(ntpStdHep->IdHEP)==111){
00142 fStdHepInfo.emenergy+=energy;
00143 fStdHepInfo.emcount++;
00144 }
00145
00146
00147
00148
00149
00150 if (isLeptonic(ntpStdHep->index, stdhepArray)){
00151
00152 fStdHepInfo.lepnfs += 1;
00153 fStdHepInfo.lepetot += energy;
00154 fStdHepInfo.leppztot += pz;
00155 fStdHepInfo.leppttot += pt;
00156 fStdHepInfo.lepwfs += ke;
00157
00158 if(mom>lepmaxmom) lepmaxmom = mom;
00159 if(ke>lepmaxke) lepmaxke = ke;
00160 if(ke>0.5) fStdHepInfo.lepnfs_he += 1;
00161
00162
00163
00164
00165 if(abs(ntpStdHep->IdHEP)==11||abs(ntpStdHep->IdHEP)==13||abs(ntpStdHep->IdHEP)==15){
00166 fStdHepInfo.lep2leptype =ntpStdHep->IdHEP;
00167 }
00168
00169
00170
00171
00172
00173
00174 if(abs(ntpStdHep->IdHEP)==11 || abs(ntpStdHep->IdHEP)==13 ||
00175 abs(ntpStdHep->IdHEP)==15) {
00176 fStdHepInfo.lepnlep += 1;
00177 if(ke>0.5) fStdHepInfo.lepnlep_he += 1;
00178 fStdHepInfo.lepelep += energy;
00179 fStdHepInfo.leppzlep += pz;
00180 fStdHepInfo.lepptlep += pt;
00181 fStdHepInfo.lepwlep += ke;
00182 }
00183 else if(ntpStdHep->IdHEP==28) {
00184 fStdHepInfo.lepngeant += 1;
00185 if(ke>0.5) fStdHepInfo.lepngeant_he += 1;
00186 fStdHepInfo.lepegeant += energy;
00187 fStdHepInfo.leppzgeant += pz;
00188 fStdHepInfo.lepptgeant += pt;
00189 fStdHepInfo.lepwgeant += ke;
00190 }
00191 else if(ntpStdHep->IdHEP==2212) {
00192 fStdHepInfo.lepnprot += 1;
00193 if(ke>0.5) fStdHepInfo.lepnprot_he += 1;
00194 fStdHepInfo.lepeprot += energy;
00195 fStdHepInfo.leppzprot += pz;
00196 fStdHepInfo.lepptprot += pt;
00197 fStdHepInfo.lepwprot += ke;
00198 }
00199 else if(ntpStdHep->IdHEP==2112) {
00200 fStdHepInfo.lepnneut += 1;
00201 if(ke>0.5) fStdHepInfo.lepnneut_he += 1;
00202 fStdHepInfo.lepeneut += energy;
00203 fStdHepInfo.leppzneut += pz;
00204 fStdHepInfo.lepptneut += pt;
00205 fStdHepInfo.lepwneut += ke;
00206 }
00207 else if(ntpStdHep->IdHEP==211) {
00208 fStdHepInfo.lepnpip += 1;
00209 if(ke>0.5) fStdHepInfo.lepnpip_he += 1;
00210 fStdHepInfo.lepepip += energy;
00211 fStdHepInfo.leppzpip += pz;
00212 fStdHepInfo.lepptpip += pt;
00213 fStdHepInfo.lepwpip += ke;
00214 }
00215 else if(ntpStdHep->IdHEP==-211) {
00216 fStdHepInfo.lepnpim += 1;
00217 if(ke>0.5) fStdHepInfo.lepnpim_he += 1;
00218 fStdHepInfo.lepepim += energy;
00219 fStdHepInfo.leppzpim += pz;
00220 fStdHepInfo.lepptpim += pt;
00221 fStdHepInfo.lepwpim += ke;
00222 }
00223 else if(ntpStdHep->IdHEP==111) {
00224 fStdHepInfo.lepnpi0 += 1;
00225 if(ke>0.5) fStdHepInfo.lepnpi0_he += 1;
00226 fStdHepInfo.lepepi0 += energy;
00227 fStdHepInfo.leppzpi0 += pz;
00228 fStdHepInfo.lepptpi0 += pt;
00229 fStdHepInfo.lepwpi0 += ke;
00230 }
00231 else if(TMath::Abs(ntpStdHep->IdHEP)==321 ||
00232 ntpStdHep->IdHEP==130 ||
00233 ntpStdHep->IdHEP==310 ||
00234 ntpStdHep->IdHEP==311 ) {
00235 fStdHepInfo.lepnkaon += 1;
00236 if(ke>0.5) fStdHepInfo.lepnkaon_he += 1;
00237 fStdHepInfo.lepekaon += energy;
00238 fStdHepInfo.leppzkaon += pz;
00239 fStdHepInfo.lepptkaon += pt;
00240 fStdHepInfo.lepwkaon += ke;
00241 }
00242
00243
00244 }
00245
00246
00247
00248
00249
00250
00251
00252 if(abs(ntpStdHep->IdHEP)==11 || abs(ntpStdHep->IdHEP)==13 ||
00253 abs(ntpStdHep->IdHEP)==15) {
00254 fStdHepInfo.nlep += 1;
00255 if(ke>0.5) fStdHepInfo.nlep_he += 1;
00256 fStdHepInfo.elep += energy;
00257 fStdHepInfo.pzlep += pz;
00258 fStdHepInfo.ptlep += pt;
00259 fStdHepInfo.wlep += ke;
00260 }
00261 else if(ntpStdHep->IdHEP==28) {
00262 fStdHepInfo.ngeant += 1;
00263 if(ke>0.5) fStdHepInfo.ngeant_he += 1;
00264 fStdHepInfo.egeant += energy;
00265 fStdHepInfo.pzgeant += pz;
00266 fStdHepInfo.ptgeant += pt;
00267 fStdHepInfo.wgeant += ke;
00268 }
00269 else if(ntpStdHep->IdHEP==2212) {
00270 fStdHepInfo.nprot += 1;
00271 if(ke>0.5) fStdHepInfo.nprot_he += 1;
00272 fStdHepInfo.eprot += energy;
00273 fStdHepInfo.pzprot += pz;
00274 fStdHepInfo.ptprot += pt;
00275 fStdHepInfo.wprot += ke;
00276 }
00277 else if(ntpStdHep->IdHEP==2112) {
00278 fStdHepInfo.nneut += 1;
00279 if(ke>0.5) fStdHepInfo.nneut_he += 1;
00280 fStdHepInfo.eneut += energy;
00281 fStdHepInfo.pzneut += pz;
00282 fStdHepInfo.ptneut += pt;
00283 fStdHepInfo.wneut += ke;
00284 }
00285 else if(ntpStdHep->IdHEP==211) {
00286 fStdHepInfo.npip += 1;
00287 if(ke>0.5) fStdHepInfo.npip_he += 1;
00288 fStdHepInfo.epip += energy;
00289 fStdHepInfo.pzpip += pz;
00290 fStdHepInfo.ptpip += pt;
00291 fStdHepInfo.wpip += ke;
00292 }
00293 else if(ntpStdHep->IdHEP==-211) {
00294 fStdHepInfo.npim += 1;
00295 if(ke>0.5) fStdHepInfo.npim_he += 1;
00296 fStdHepInfo.epim += energy;
00297 fStdHepInfo.pzpim += pz;
00298 fStdHepInfo.ptpim += pt;
00299 fStdHepInfo.wpim += ke;
00300 }
00301 else if(ntpStdHep->IdHEP==111) {
00302 fStdHepInfo.npi0 += 1;
00303 if(ke>0.5) fStdHepInfo.npi0_he += 1;
00304 fStdHepInfo.epi0 += energy;
00305 fStdHepInfo.pzpi0 += pz;
00306 fStdHepInfo.ptpi0 += pt;
00307 fStdHepInfo.wpi0 += ke;
00308 }
00309 else if(TMath::Abs(ntpStdHep->IdHEP)==321 ||
00310 ntpStdHep->IdHEP==130 ||
00311 ntpStdHep->IdHEP==310 ||
00312 ntpStdHep->IdHEP==311 ) {
00313 fStdHepInfo.nkaon += 1;
00314 if(ke>0.5) fStdHepInfo.nkaon_he += 1;
00315 fStdHepInfo.ekaon += energy;
00316 fStdHepInfo.pzkaon += pz;
00317 fStdHepInfo.ptkaon += pt;
00318 fStdHepInfo.wkaon += ke;
00319 }
00320 }
00321 }
00322 }
00323 if(maxke>0){
00324 fStdHepInfo.wfs /= maxke;
00325 fStdHepInfo.wgeant /= maxke;
00326 fStdHepInfo.wlep /= maxke;
00327 fStdHepInfo.wprot /= maxke;
00328 fStdHepInfo.wneut /= maxke;
00329 fStdHepInfo.wpip /= maxke;
00330 fStdHepInfo.wpim /= maxke;
00331 fStdHepInfo.wpi0 /= maxke;
00332 fStdHepInfo.wkaon /= maxke;
00333 }
00334
00335 if(lepmaxke>0){
00336 fStdHepInfo.lepwfs /= lepmaxke;
00337 fStdHepInfo.lepwgeant /= lepmaxke;
00338 fStdHepInfo.lepwlep /= lepmaxke;
00339 fStdHepInfo.lepwprot /= lepmaxke;
00340 fStdHepInfo.lepwneut /= lepmaxke;
00341 fStdHepInfo.lepwpip /= lepmaxke;
00342 fStdHepInfo.lepwpim /= lepmaxke;
00343 fStdHepInfo.lepwpi0 /= lepmaxke;
00344 fStdHepInfo.lepwkaon /= lepmaxke;
00345 }
00346
00347
00348 if(initialNuEnergy>0){
00349 fStdHepInfo.emfrac=fStdHepInfo.emenergy /initialNuEnergy;
00350
00351 }else{
00352 fStdHepInfo.emfrac= ANtpDefVal::kDouble;
00353 }
00354
00355
00356
00357 if(fStdHepInfo.pttot>0)
00358 fStdHepInfo.pttot = TMath::Sqrt(fStdHepInfo.pttot);
00359 if(fStdHepInfo.ptgeant>0)
00360 fStdHepInfo.ptgeant = TMath::Sqrt(fStdHepInfo.ptgeant);
00361 if(fStdHepInfo.ptlep>0)
00362 fStdHepInfo.ptlep = TMath::Sqrt(fStdHepInfo.ptlep);
00363 if(fStdHepInfo.ptprot>0)
00364 fStdHepInfo.ptprot = TMath::Sqrt(fStdHepInfo.ptprot);
00365 if(fStdHepInfo.ptneut>0)
00366 fStdHepInfo.ptneut = TMath::Sqrt(fStdHepInfo.ptneut);
00367 if(fStdHepInfo.ptpip>0)
00368 fStdHepInfo.ptpip = TMath::Sqrt(fStdHepInfo.ptpip);
00369 if(fStdHepInfo.ptpim>0)
00370 fStdHepInfo.ptpim = TMath::Sqrt(fStdHepInfo.ptpim);
00371 if(fStdHepInfo.ptpi0>0)
00372 fStdHepInfo.ptpi0 = TMath::Sqrt(fStdHepInfo.ptpi0);
00373 if(fStdHepInfo.ptkaon>0)
00374 fStdHepInfo.ptkaon = TMath::Sqrt(fStdHepInfo.ptkaon);
00375
00376 if(fStdHepInfo.leppttot>0)
00377 fStdHepInfo.leppttot = TMath::Sqrt(fStdHepInfo.leppttot);
00378 if(fStdHepInfo.lepptgeant>0)
00379 fStdHepInfo.lepptgeant = TMath::Sqrt(fStdHepInfo.lepptgeant);
00380 if(fStdHepInfo.lepptlep>0)
00381 fStdHepInfo.lepptlep = TMath::Sqrt(fStdHepInfo.lepptlep);
00382 if(fStdHepInfo.lepptprot>0)
00383 fStdHepInfo.lepptprot = TMath::Sqrt(fStdHepInfo.lepptprot);
00384 if(fStdHepInfo.lepptneut>0)
00385 fStdHepInfo.lepptneut = TMath::Sqrt(fStdHepInfo.lepptneut);
00386 if(fStdHepInfo.lepptpip>0)
00387 fStdHepInfo.lepptpip = TMath::Sqrt(fStdHepInfo.lepptpip);
00388 if(fStdHepInfo.lepptpim>0)
00389 fStdHepInfo.lepptpim = TMath::Sqrt(fStdHepInfo.lepptpim);
00390 if(fStdHepInfo.lepptpi0>0)
00391 fStdHepInfo.lepptpi0 = TMath::Sqrt(fStdHepInfo.lepptpi0);
00392 if(fStdHepInfo.lepptkaon>0)
00393 fStdHepInfo.lepptkaon = TMath::Sqrt(fStdHepInfo.lepptkaon);
00394 }
00395 }
00396 }
00397
00398
00399
00400
00401
00402 bool isLeptonic(int parent, TClonesArray& stdhepArray)
00403 {
00404
00405 NtpMCStdHep *ntpStdHepTemp = 0;
00406 ntpStdHepTemp = dynamic_cast<NtpMCStdHep *>(stdhepArray[parent]);
00407 int parentID = ntpStdHepTemp->IdHEP;
00408
00409 if ((abs(parentID)==12||abs(parentID)==14||abs(parentID)==16)&&ntpStdHepTemp->IstHEP==0)return true;
00410 if (ntpStdHepTemp->parent[0]==-1||ntpStdHepTemp->parent[1]==-1)return false;
00411
00412 if (isLeptonic(ntpStdHepTemp->parent[0],stdhepArray)) return true;
00413 if (ntpStdHepTemp->parent[0]!=ntpStdHepTemp->parent[1])
00414 {
00415 if (isLeptonic(ntpStdHepTemp->parent[1],stdhepArray)) return true;
00416 }
00417
00418 return false;
00419
00420 }
00421
00422
00423
00424
00425 bool checkParent(int parent, TClonesArray& stdhepArray)
00426 {
00427
00428 NtpMCStdHep *ntpStdHepTemp = 0;
00429 ntpStdHepTemp = dynamic_cast<NtpMCStdHep *>(stdhepArray[parent]);
00430 int parentID = ntpStdHepTemp->IdHEP;
00431
00432 if(!(ntpStdHepTemp->IstHEP==1||ntpStdHepTemp->IstHEP==205))return false;
00433
00434 if ((abs(parentID)==22||abs(parentID)==111||abs(parentID)==11))return true;
00435
00436 if (checkParent(ntpStdHepTemp->parent[0],stdhepArray)) return true;
00437 if (ntpStdHepTemp->parent[0]!=ntpStdHepTemp->parent[1])
00438 {
00439 if (checkParent(ntpStdHepTemp->parent[1],stdhepArray)) return true;
00440 }
00441
00442 return false;
00443
00444 }
00445
00446
00447
00448 void countpi0(int index, TClonesArray& stdhepArray, StdHepInfo &fStdHepInfo)
00449 {
00450
00451 Int_t nStdHep = stdhepArray.GetEntries();
00452 NtpMCStdHep *ntpStdHep = 0;
00453 for(int i=0; i<nStdHep; i++){
00454 ntpStdHep = dynamic_cast<NtpMCStdHep *>(stdhepArray[i]);
00455
00456 if(ntpStdHep->mc!=index) continue;
00457
00458 if(ntpStdHep->IdHEP==111){
00459
00460 bool resdecay = true;
00461 for (int ip = ntpStdHep->parent[0]; ip<=ntpStdHep->parent[1]; ip++){
00462 if (ip==-1) {
00463 resdecay = false;
00464 break;
00465 }
00466 NtpMCStdHep *parent = dynamic_cast<NtpMCStdHep *>(stdhepArray[ip]);
00467 resdecay = resdecay && (parent->IstHEP==3);
00468 if (!resdecay) break;
00469 }
00470 if (resdecay) fStdHepInfo.epi0_neugen += TMath::Abs(ntpStdHep->p4[3]);
00471
00472 Double_t etmp = 0;
00473 for (int ic = ntpStdHep->child[0]; ic<=ntpStdHep->child[1]; ic++){
00474 if (ic==-1) break;
00475 NtpMCStdHep *child = dynamic_cast<NtpMCStdHep *>(stdhepArray[ic]);
00476 if (child->IdHEP==111) etmp += TMath::Abs(child->p4[3]);
00477 }
00478 if (ntpStdHep->IstHEP!=205 &&
00479 ntpStdHep->IstHEP!=1205 &&
00480 ntpStdHep->child[0]!=-1 &&
00481 ntpStdHep->child[1]!=-1){
00482 fStdHepInfo.epi0_abs += TMath::Abs(ntpStdHep->p4[3]) - etmp;
00483 }
00484
00485 bool pi0pro = true;
00486 for (int ip = ntpStdHep->parent[0]; ip<=ntpStdHep->parent[1]; ip++){
00487 if (ip==-1) {
00488 pi0pro = false;
00489 break;
00490 }
00491 NtpMCStdHep *parent = dynamic_cast<NtpMCStdHep *>(stdhepArray[ip]);
00492 pi0pro = pi0pro&&(parent->IstHEP == 14 && parent->IdHEP != 111);
00493 if (!pi0pro) break;
00494 }
00495 if (pi0pro) {
00496 fStdHepInfo.epi0_intranuke += TMath::Abs(ntpStdHep->p4[3]);
00497 fStdHepInfo.epi0_total += TMath::Abs(ntpStdHep->p4[3]);
00498 }
00499 else if (ntpStdHep->IstHEP == 1){
00500 fStdHepInfo.epi0_total += TMath::Abs(ntpStdHep->p4[3]);
00501 }
00502
00503 bool decay = true;
00504 for (int ip = ntpStdHep->parent[0]; ip<=ntpStdHep->parent[1]; ip++){
00505 if (ip==-1) {
00506 decay = false;
00507 break;
00508 }
00509 NtpMCStdHep *parent = dynamic_cast<NtpMCStdHep *>(stdhepArray[ip]);
00510 decay = decay&&(parent->IstHEP == 1 &&
00511 (ntpStdHep->IstHEP == 205||ntpStdHep->IstHEP == 1205)
00512 && parent->IdHEP != 111);
00513 if (!decay) break;
00514 }
00515 if (decay) {
00516 fStdHepInfo.epi0_intranuke += TMath::Abs(ntpStdHep->p4[3]);
00517 fStdHepInfo.epi0_total += TMath::Abs(ntpStdHep->p4[3]);
00518 }
00519 }
00520 else if(ntpStdHep->IdHEP==22){
00521 bool decay = true;
00522 for (int ip = ntpStdHep->parent[0]; ip<=ntpStdHep->parent[1]; ip++){
00523 if (ip==-1) {
00524 decay = false;
00525 break;
00526 }
00527 NtpMCStdHep *parent = dynamic_cast<NtpMCStdHep *>(stdhepArray[ip]);
00528 decay = decay&&(parent->IstHEP == 1 &&
00529 (ntpStdHep->IstHEP == 205||ntpStdHep->IstHEP == 1205)
00530 &&parent->IdHEP != 111);
00531 if (!decay) break;
00532 }
00533 if (decay) {
00534 fStdHepInfo.epi0_intranuke += TMath::Abs(ntpStdHep->p4[3]);
00535 fStdHepInfo.epi0_total += TMath::Abs(ntpStdHep->p4[3]);
00536 }
00537 }
00538 }
00539
00540
00541
00542
00543
00544
00545 }
00546
00547 void calbaryonpt(int index, TClonesArray& stdhepArray, StdHepInfo &fStdHepInfo)
00548 {
00549
00550 vector<int> pid;
00551 vector<double> px;
00552 vector<double> py;
00553 vector<double> pz;
00554 vector<double> eng;
00555 vector<double> mass;
00556
00557 double hspx = 0.;
00558 double hspy = 0.;
00559 double hspz = 0.;
00560 double hse = 0.;
00561 double beta = 0.;
00562 double gamma = 0.;
00563
00564
00565 Int_t nStdHep = stdhepArray.GetEntries();
00566 NtpMCStdHep *ntpStdHep = 0;
00567 for(int i=0; i<nStdHep; i++){
00568 ntpStdHep = dynamic_cast<NtpMCStdHep *>(stdhepArray[i]);
00569
00570 if(ntpStdHep->mc!=index) continue;
00571
00572 if(ntpStdHep->IstHEP==3){
00573 if (TMath::Abs(ntpStdHep->p4[3])>hse){
00574 hspx = ntpStdHep->p4[0];
00575 hspy = ntpStdHep->p4[1];
00576 hspz = ntpStdHep->p4[2];
00577 hse = TMath::Abs(ntpStdHep->p4[3]);
00578 }
00579 }
00580 else {
00581
00582 bool resdecay = true;
00583 for (int ip = ntpStdHep->parent[0]; ip<=ntpStdHep->parent[1]; ip++){
00584 if (ip==-1) {
00585 resdecay = false;
00586 break;
00587 }
00588 NtpMCStdHep *parent = dynamic_cast<NtpMCStdHep *>(stdhepArray[ip]);
00589 resdecay = resdecay && (parent->IstHEP==3);
00590 if (!resdecay) break;
00591 }
00592 if (resdecay&&ntpStdHep->IdHEP) {
00593 pid.push_back(ntpStdHep->IdHEP);
00594 px.push_back(ntpStdHep->p4[0]);
00595 py.push_back(ntpStdHep->p4[1]);
00596 pz.push_back(ntpStdHep->p4[2]);
00597 eng.push_back(ntpStdHep->p4[3]);
00598 mass.push_back(ntpStdHep->mass);
00599 }
00600 }
00601 }
00602
00603 double maxbaryone = 0;
00604 double Phs = sqrt(pow(hspx,2)+pow(hspy,2)+pow(hspz,2));
00605
00606 if (Phs>=0.&&hse>Phs){
00607 beta = Phs/hse;
00608 gamma = hse/sqrt(pow(hse,2)-pow(Phs,2));
00609 }
00610
00611
00612 for (unsigned ipar = 0; ipar<pid.size(); ipar++){
00613 double ptot = sqrt(pow(px[ipar],2)+pow(py[ipar],2)+pow(pz[ipar],2));
00614 double Pz = 0;
00615 if (Phs>0) Pz = (px[ipar]*hspx+py[ipar]*hspy+pz[ipar]*hspz)/Phs;
00616 double pt = pow(ptot,2)-pow(Pz,2);
00617 Pz = gamma*(Pz-beta*eng[ipar]);
00618 if (pt>0.00000001) pt = sqrt(pt);
00619 else pt = 0;
00620 if (TMath::Abs(pid[ipar])==2212||TMath::Abs(pid[ipar])==2112){
00621 if (eng[ipar]>maxbaryone){
00622 maxbaryone = eng[ipar];
00623 fStdHepInfo.baryonpt = pt;
00624 fStdHepInfo.baryonxf = Pz;
00625 }
00626 }
00627 if (pid[ipar]==111) fStdHepInfo.npi0_neugen++;
00628 fStdHepInfo.totpt += pt;
00629 }
00630 fStdHepInfo.nhad = int(pid.size());
00631 }
00632
00633 void HughCode(NtpMCTruth* mctruth, TClonesArray& stdhepArray, StdHepInfo& shi)
00634 {
00635
00636 NtpMCStdHep* ntpStdHep = 0;
00637
00638 bool foundFirst = false;
00639 int index = 0;
00640
00641 double Etot = 0.0;
00642 double EMtot = 0.0;
00643 int npi0 = 0;
00644 int nch = 0;
00645 int ntot = 0;
00646
00647 for(int i=mctruth->stdhep[0];i<=mctruth->stdhep[1]&&!foundFirst;i++){
00648 ntpStdHep = dynamic_cast<NtpMCStdHep *>(stdhepArray[i]);
00649
00650 if(ntpStdHep->mc!=mctruth->index) cout<<"Big Problem"<<endl;
00651
00652 if(!foundFirst && ntpStdHep->IstHEP == 3) foundFirst = true;
00653 else continue;
00654 index = i;
00655 }
00656
00657 if(foundFirst){
00658 int start = ntpStdHep->child[0];
00659 int end = ntpStdHep->child[1];
00660
00661 CalcDaughters(start, end, Etot, EMtot, npi0, nch, ntot, stdhepArray);
00662
00663 Etot = Etot - 0.935;
00664 }
00665
00666 shi.e_total = Etot;
00667 shi.em_total = EMtot;
00668 shi.npi0_jbhg = npi0;
00669 shi.nch_jbhg = nch;
00670 shi.ntot_jbhg = ntot;
00671 }
00672
00673 void CalcDaughters(int start, int end, double &E, double &EmE, int &npi0, int &nch, int &ntot, TClonesArray&
00674 stdhepArray)
00675 {
00676 NtpMCStdHep* ntpStdHep = 0;
00677
00678 for(int j = start; j <= end; j++){
00679 ntpStdHep = dynamic_cast<NtpMCStdHep *>(stdhepArray[j]);
00680 int id = ntpStdHep->IdHEP;
00681 int ist = ntpStdHep->IstHEP;
00682 if(ist == 3){
00683 int st = ntpStdHep->child[0];
00684 int en = ntpStdHep->child[1];
00685 CalcDaughters(st, en, E, EmE, npi0, nch, ntot, stdhepArray);
00686 }
00687
00688 float Etemp = ntpStdHep->p4[3];
00689
00690 E += Etemp;
00691 if(id == 111 || id == 22){
00692 EmE += Etemp;
00693 npi0++;
00694 }
00695 if(id == 211 || id == -211) nch++;
00696 ntot++;
00697 }
00698 }
00699
00700