00001 #include "DataUtil/TruthHelper.h"
00002
00003 #include "TClonesArray.h"
00004 #include "TArrayI.h"
00005 #include "TArrayF.h"
00006
00007 #include "MessageService/MsgService.h"
00008 #include "MinosObjectMap/MomNavigator.h"
00009
00010 #include "RecoBase/CandSliceListHandle.h"
00011 #include "RecoBase/CandTrackListHandle.h"
00012 #include "RecoBase/CandFitTrackHandle.h"
00013 #include "RecoBase/CandTrackHandle.h"
00014
00015 #include "RecoBase/CandShowerListHandle.h"
00016 #include "RecoBase/CandStripHandle.h"
00017 #include "RecoBase/CandStripListHandle.h"
00018 #include "RecoBase/CandStripListHandle.h"
00019 #include "RecoBase/CandEventHandle.h"
00020 #include "RecoBase/CandEventListHandle.h"
00021
00022 #include "CandDigit/CandDigitHandle.h"
00023
00024 #include "DataUtil/Truthifier.h"
00025 #include "Digitization/DigiScintHit.h"
00026 #include "Digitization/DigiSignal.h"
00027 #include "Record/SimSnarlRecord.h"
00028 #include "MCNtuple/NtpMCStdHep.h"
00029
00030 ClassImp(TruthHelper)
00031 CVSID("$Id: TruthHelper.cxx,v 1.16 2008/11/05 17:42:27 rodriges Exp $");
00032
00033 TruthHelper::TruthHelper()
00034 {
00035 }
00036
00037 TruthHelper::TruthHelper(const MomNavigator * mom)
00038 :fMom(mom)
00039 {
00040 }
00041
00042 TruthHelper::~TruthHelper()
00043 {
00044 }
00045
00047
00048 Bool_t TruthHelper::IsNeutrino(const TParticle * part)
00049 {
00050 if(abs(part->GetPdgCode())==12 ||
00051 abs(part->GetPdgCode())==14 ||
00052 abs(part->GetPdgCode())==16)return true;
00053 return false;
00054 }
00055
00056 Bool_t TruthHelper::IsMuon(const TParticle * part)
00057 {
00058 if(abs(part->GetPdgCode())==13)return true;
00059 return false;
00060 }
00061
00062 Bool_t TruthHelper::IsPion(const TParticle * part)
00063 {
00064 if(abs(part->GetPdgCode())==211)return true;
00065 return false;
00066 }
00067
00068 Bool_t TruthHelper::IsP0(const TParticle * part)
00069 {
00070 if(abs(part->GetPdgCode())==111)return true;
00071 return false;
00072 }
00073
00074 Bool_t TruthHelper::IsGamma(const TParticle * part)
00075 {
00076 if(abs(part->GetPdgCode())==22)return true;
00077 return false;
00078 }
00079
00080 Bool_t TruthHelper::IsProton(const TParticle * part)
00081 {
00082 if(abs(part->GetPdgCode())==2212)return true;
00083 return false;
00084 }
00085
00086 Bool_t TruthHelper::IsNeutron(const TParticle * part)
00087 {
00088 if(abs(part->GetPdgCode())==2112)return true;
00089 return false;
00090 }
00091
00092 Bool_t TruthHelper::IsElectron(const TParticle * part)
00093 {
00094 if(abs(part->GetPdgCode())==11)return true;
00095 return false;
00096 }
00097
00098 Bool_t TruthHelper::IsPrimaryShowerPart( const TParticle * part)
00099 {
00100 if(IsNeutrino(part) || IsMuon(part)) return false;
00101 SimSnarlRecord *ssr =
00102 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00103 if (ssr){
00104 const TClonesArray* ctca =
00105 dynamic_cast<const TClonesArray*>
00106 (ssr->FindComponent("TClonesArray","StdHep"));
00107 Int_t status = part->GetStatusCode();
00108 const TParticle * chainpart = part;
00109 while (status == 205 || status == 212){
00110 chainpart = dynamic_cast<const TParticle*>((*ctca)[chainpart->GetFirstMother()]);
00111 status = chainpart->GetStatusCode();
00112 }
00113 if(status !=1 || IsNeutrino(chainpart) || IsMuon(chainpart)) return false;
00114 }
00115 return true;
00116 }
00117
00118 Bool_t TruthHelper::IsDocStatus(const TParticle * part)
00119 {
00120
00121
00122
00123 Int_t status = part->GetStatusCode();
00124 if( status == 3 || status == 0 ) return true;
00125 return false;
00126 }
00127
00129
00130 Int_t TruthHelper::GetNeuId(Int_t trackId)
00131 {
00132 Int_t neuId=-1;
00133 SimSnarlRecord *ssr =
00134 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00135 if (ssr){
00136 const TClonesArray* ctca =
00137 dynamic_cast<const TClonesArray*>
00138 (ssr->FindComponent("TClonesArray","StdHep"));
00139 for( Int_t ind=trackId; ind>-1; ind--){
00140 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00141 if(IsNeutrino(part) && IsDocStatus(part)){
00142 neuId=ind;
00143 return neuId;
00144 }
00145 }
00146 }
00147 return -1;
00148 }
00149
00150 Int_t TruthHelper::GetNextNeuId(Int_t trackId)
00151 {
00152 Int_t neuId=-1;
00153 Int_t siz=-1;
00154 SimSnarlRecord *ssr =
00155 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00156 if (ssr){
00157 const TClonesArray* ctca =
00158 dynamic_cast<const TClonesArray*>
00159 (ssr->FindComponent("TClonesArray","StdHep"));
00160 siz = ctca->GetEntriesFast();
00161 for( Int_t ind=trackId+1; ind<siz; ind++){
00162 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00163 if(IsNeutrino(part) && IsDocStatus(part)) {
00164 neuId=ind;
00165 return neuId;
00166 }
00167 }
00168 }
00169 return siz;
00170 }
00171
00172 Int_t TruthHelper::GetStripNeuIndex(CandStripHandle *csh)
00173 {
00174
00175 const Truthifier & truth = Truthifier::Instance(fMom);
00176 SimSnarlRecord *ssr =
00177 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00178 Int_t tracky = -1;
00179 Bool_t found = false;
00180 if (ssr){
00181 TIter digitItr(csh->GetDaughterIterator());
00182 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())) {
00183 CandDigitHandle tcdh = *cdh;
00184 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00185 const DigiSignal * signal = truth.GetSignal(tcdh);
00186 if(signal){
00187 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00188 const DigiScintHit * hit = signal->GetHit(i);
00189 if(hit){
00190 tracky = abs(hit->TrackId());
00191 found=true;
00192 }
00193 }
00194 }
00195 }
00196 }
00197 }
00198 return tracky;
00199 }
00200
00201 Int_t TruthHelper::GetNeuKinIndex(Int_t trackId)
00202 {
00203 Int_t neuKinIndex=-1;
00204 SimSnarlRecord *ssr =
00205 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00206 if (ssr){
00207 const TClonesArray* ctca =
00208 dynamic_cast<const TClonesArray*>
00209 (ssr->FindComponent("TClonesArray","StdHep"));
00210 Int_t siz = ctca->GetEntriesFast();
00211 if(trackId<siz && trackId>=0){
00212 for (Int_t ind=0; ind <= trackId; ++ind) {
00213 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00214 if(IsNeutrino(part) && IsDocStatus(part)){
00215 neuKinIndex++;
00216 }
00217 }
00218 }
00219 }
00220 return neuKinIndex;
00221 }
00222
00223
00224 Int_t TruthHelper::GetBestNeuMatch(const CandDigitHandle &cdh)
00225 {
00226 Int_t bestNeu=-1;
00227 Double_t maxDE=0;
00228 const Truthifier & truth = Truthifier::Instance(fMom);
00229 const DigiSignal * signal = truth.GetSignal(cdh);
00230 if(signal){
00231 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00232 const DigiScintHit * hit = signal->GetHit(i);
00233 if(hit)
00234 {
00235 if(hit->DE()>maxDE){
00236 Int_t track = abs(hit->TrackId());
00237 bestNeu=GetNeuKinIndex(track);
00238 maxDE=hit->DE();
00239 }
00240 }
00241 }
00242 }
00243 return bestNeu;
00244 }
00245
00246 Int_t TruthHelper::GetBestNeuMatch(const CandStripHandle &csh)
00247 {
00248 Int_t bestNeu=-1;
00249 Double_t maxDE=0;
00250 const Truthifier & truth = Truthifier::Instance(fMom);
00251 TIter digitItr(csh.GetDaughterIterator());
00252 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr()))
00253 {
00254 CandDigitHandle tcdh = *cdh;
00255 const DigiSignal * signal = truth.GetSignal(tcdh);
00256 if(signal){
00257 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00258 const DigiScintHit * hit = signal->GetHit(i);
00259 if(hit)
00260 {
00261 if(hit->DE()>maxDE){
00262 Int_t track = abs(hit->TrackId());
00263 bestNeu=GetNeuKinIndex(track);
00264 maxDE=hit->DE();
00265 }
00266 }
00267 }
00268 }
00269 }
00270 return bestNeu;
00271 }
00272
00273 Int_t TruthHelper::GetBestTrackIdMatch(CandTrackHandle& cth)
00274 {
00275 const Truthifier & truth = Truthifier::Instance(fMom);
00276 Int_t bestTrack=-1;
00277 SimSnarlRecord *ssr =
00278 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00279 if (ssr){
00280 const TClonesArray* ctca =
00281 dynamic_cast<const TClonesArray*>
00282 (ssr->FindComponent("TClonesArray","StdHep"));
00283 Int_t siz = ctca->GetEntriesFast();
00284 TArrayI nTrackHits(siz);
00285 nTrackHits.Reset(0);
00286 TIter stripitr(cth.GetDaughterIterator());
00287 while (CandStripHandle* csh = dynamic_cast<CandStripHandle*>(stripitr())) {
00288 TIter digitItr(csh->GetDaughterIterator());
00289 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00290 CandDigitHandle tcdh = *cdh;
00291 const DigiSignal * signal = truth.GetSignal(tcdh);
00292 if(signal){
00293 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00294 const DigiScintHit * hit = signal->GetHit(i);
00295 if(hit){
00296 Int_t track = abs(hit->TrackId());
00297 if(track<siz){
00298 nTrackHits[track]++;
00299 }
00300 else{
00301 MSG("TruthHelper",Msg::kWarning) << "StdHep size or less than zero" << endl;
00302 }
00303
00304 }
00305 }
00306 }
00307 }
00308 }
00309 Int_t nMax=0;
00310 for (Int_t ind=0; ind < siz; ++ind) {
00311 if(nTrackHits[ind]>nMax){
00312 nMax=nTrackHits[ind];
00313 bestTrack=ind;
00314 }
00315 }
00316 }
00317 return bestTrack;
00318 }
00319 int TruthHelper::GetBestEventNeuMatch(CandEventHandle &ceh)
00320 {
00321 const Truthifier & truth = Truthifier::Instance(fMom);
00322 Int_t BestNeu=-1;
00323 Int_t nNeutrinos=0;
00324 SimSnarlRecord *ssr =
00325 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00326 if (ssr) {
00327 const TClonesArray* ctca =
00328 dynamic_cast<const TClonesArray*>
00329 (ssr->FindComponent("TClonesArray","StdHep"));
00330 Int_t siz = ctca->GetEntriesFast();
00331 TArrayI neuIndBuf(siz+1);
00332 TArrayF neuEBuf(siz);
00333 for (Int_t ind=0; ind < siz; ++ind) {
00334 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00335 if(IsNeutrino(part) && IsDocStatus(part)) {
00336 neuIndBuf[nNeutrinos]=ind;
00337 neuEBuf[nNeutrinos]=0;
00338 nNeutrinos++;
00339 }
00340 }
00341 neuIndBuf[nNeutrinos]=siz;
00342
00343 for(Int_t ind=0; ind< nNeutrinos; ++ind) {
00344 TIter stripitr(ceh.GetDaughterIterator());
00345 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00346 TIter digitItr(cstriph->GetDaughterIterator());
00347 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00348 Bool_t found=false;
00349 CandDigitHandle tcdh = *cdh;
00350 const DigiSignal * signal = truth.GetSignal(tcdh);
00351 if(signal){
00352 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00353 const DigiScintHit * hit = signal->GetHit(i);
00354 if(hit){
00355 Int_t track = abs(hit->TrackId());
00356 if(track>=neuIndBuf[ind] && track <= neuIndBuf[ind+1]){
00357 found=true;
00358 }
00359 }
00360 }
00361 }
00362 if(found) {
00363 neuEBuf[ind]+=cdh->GetCharge();
00364 }
00365 }
00366 }
00367 }
00368
00369 Float_t PEMax=0;
00370 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00371 if(neuEBuf[ind]>PEMax){
00372 PEMax=neuEBuf[ind];
00373 BestNeu=neuIndBuf[ind];
00374 }
00375 }
00376 }
00377 return BestNeu;
00378 }
00379
00380 Float_t TruthHelper::EventPurity( CandEventHandle& ceh, Int_t neuId)
00381 {
00382 const Truthifier & truth = Truthifier::Instance(fMom);
00383 Int_t nextneuId = GetNextNeuId(neuId);
00384 Float_t totalPE=0;
00385 Float_t hitPE=0;
00386
00387 TIter stripitr(ceh.GetDaughterIterator());
00388 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00389 TIter digitItr(cstriph->GetDaughterIterator());
00390 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00391 Bool_t found=false;
00392 CandDigitHandle tcdh = *cdh;
00393 const DigiSignal * signal = truth.GetSignal(tcdh);
00394 if(signal){
00395 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00396 const DigiScintHit * hit = signal->GetHit(i);
00397 if(hit){
00398 Int_t track = abs(hit->TrackId());
00399 if(track>=neuId && track<=nextneuId){
00400 found=true;
00401 }
00402 }
00403 }
00404 }
00405 if(found) {
00406 hitPE+=cdh->GetCharge();
00407 totalPE+= cdh->GetCharge();
00408 } else {
00409 totalPE+= cdh->GetCharge();
00410 }
00411 }
00412 }
00413
00414 if(totalPE>0){
00415 return hitPE/totalPE;
00416 }
00417 return 0.;
00418 }
00419
00420 Float_t TruthHelper::EventCompleteness( CandEventHandle& ceh, CandSliceHandle &csh)
00421 {
00422 return EventCompletenessImp(ceh, &csh, false);
00423 }
00424
00425
00426 Float_t TruthHelper::EventCompleteness( CandEventHandle& ceh)
00427 {
00428 return EventCompletenessImp(ceh, 0, false);
00429 }
00430
00431 Float_t TruthHelper::EventCompletenessAllStrips( CandEventHandle& ceh,
00432 CandSliceHandle &csh)
00433 {
00434 return EventCompletenessImp(ceh, &csh, true);
00435 }
00436
00437
00438 Float_t TruthHelper::EventCompletenessAllStrips( CandEventHandle& ceh)
00439 {
00440 return EventCompletenessImp(ceh, 0, true);
00441 }
00442
00443 Float_t TruthHelper::EventCompletenessImp( CandEventHandle& ceh,
00444 CandSliceHandle* csh,
00445 bool useAllStrips)
00446 {
00447 Float_t truePE=0;
00448 Float_t evtPE=0;
00449 const Truthifier & truth = Truthifier::Instance(fMom);
00450 Int_t neuId= GetBestEventNeuMatch(ceh);
00451 Int_t nextneuId= GetNextNeuId(neuId);
00452
00453 SimSnarlRecord *ssr =
00454 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00455 if (!ssr)return 0.0;
00456
00457
00458
00459
00460 TIter evtstripitr(ceh.GetDaughterIterator());
00461
00462
00463
00464
00465
00466
00467 CandShowerHandle* cshwh=ceh.GetPrimaryShower();
00468 Double_t minStripPE= cshwh ? cshwh->GetMinStripPE() : 0.;
00469
00470
00471
00472 TIter striplistitr((TIterator*)0);
00473
00474 if(csh) {
00475
00476 striplistitr=csh->GetDaughterIterator();
00477 } else {
00478
00479 CandRecord *crec = dynamic_cast<CandRecord *>
00480 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00481
00482 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
00483 (crec->FindCandHandle("CandStripListHandle"));
00484 striplistitr=cstriplh->GetDaughterIterator();
00485 }
00486
00487 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
00488
00489
00490
00491
00492
00493
00494
00495 if ((!useAllStrips) &&
00496 cstriph->GetCharge(CalDigitType::kPE) < minStripPE) continue;
00497
00498 TIter digitItr(cstriph->GetDaughterIterator());
00499 Bool_t found=false;
00500 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00501 const CandDigitHandle tcdh = *cdh;
00502 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00503 const DigiSignal * signal = truth.GetSignal(tcdh);
00504 if(signal){
00505 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00506 const DigiScintHit * hit = signal->GetHit(i);
00507 if(hit){
00508 Int_t track = abs(hit->TrackId());
00509
00510 if(track> neuId && track<nextneuId){
00511
00512 found=true;
00513
00514 }
00515 }
00516 }
00517 }
00518 }
00519 }
00520 if(found) {
00521 truePE+=cstriph->GetCharge();
00522 evtstripitr.Reset();
00523 Int_t plane=cstriph->GetPlane();
00524 Int_t strip=cstriph->GetStrip();
00525 while (CandStripHandle* cevtstriph = dynamic_cast<CandStripHandle*>(evtstripitr())) {
00526 if(cevtstriph->GetPlane()==plane && cevtstriph->GetStrip()==strip){
00527 evtPE+=cstriph->GetCharge();
00528 break;
00529 }
00530 }
00531 }
00532 }
00533 if(truePE>0) return (evtPE/truePE);
00534 return 0.;
00535 }
00536
00537 Int_t TruthHelper::GetBestSliceNeuMatch(CandSliceHandle &csh)
00538 {
00539 const Truthifier & truth = Truthifier::Instance(fMom);
00540 Int_t BestNeu=-1;
00541 Int_t nNeutrinos=0;
00542 SimSnarlRecord *ssr =
00543 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00544 if (ssr) {
00545 const TClonesArray* ctca =
00546 dynamic_cast<const TClonesArray*>
00547 (ssr->FindComponent("TClonesArray","StdHep"));
00548 Int_t siz = ctca->GetEntriesFast();
00549 TArrayI neuIndBuf(siz+1);
00550 TArrayF neuEBuf(siz);
00551 for (Int_t ind=0; ind < siz; ++ind) {
00552 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00553 if(IsNeutrino(part) && IsDocStatus(part)) {
00554 neuIndBuf[nNeutrinos]=ind;
00555 neuEBuf[nNeutrinos]=0;
00556 nNeutrinos++;
00557 }
00558 }
00559 neuIndBuf[nNeutrinos]=siz;
00560
00561 for(Int_t ind=0; ind< nNeutrinos; ++ind) {
00562 TIter stripitr(csh.GetDaughterIterator());
00563 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00564 TIter digitItr(cstriph->GetDaughterIterator());
00565 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00566 Bool_t found=false;
00567 CandDigitHandle tcdh = *cdh;
00568 const DigiSignal * signal = truth.GetSignal(tcdh);
00569 if(signal){
00570 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00571 const DigiScintHit * hit = signal->GetHit(i);
00572 if(hit){
00573 Int_t track = abs(hit->TrackId());
00574 if(track>=neuIndBuf[ind] && track <= neuIndBuf[ind+1]){
00575 found=true;
00576 }
00577 }
00578 }
00579 }
00580 if(found) {
00581 neuEBuf[ind]+=cdh->GetCharge();
00582 }
00583 }
00584 }
00585 }
00586
00587 Float_t PEMax=0;
00588 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00589 if(neuEBuf[ind]>PEMax){
00590 PEMax=neuEBuf[ind];
00591 BestNeu=neuIndBuf[ind];
00592 }
00593 }
00594 }
00595 return BestNeu;
00596 }
00597
00598
00599 Float_t TruthHelper::secondNEU(CandSliceHandle &csh)
00600 {
00601
00602 const Truthifier & truth = Truthifier::Instance(fMom);
00603 Int_t BestNeu=-1;
00604 Float_t PEMax2 = 0.0;
00605 Float_t TotPE = 0.0;
00606 Int_t nNeutrinos=0;
00607 SimSnarlRecord *ssr =
00608 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00609 if (ssr){
00610 const TClonesArray* ctca =
00611 dynamic_cast<const TClonesArray*>
00612 (ssr->FindComponent("TClonesArray","StdHep"));
00613 Int_t siz = ctca->GetEntriesFast();
00614 TArrayI neuIndBuf(siz+1);
00615 TArrayF neuEBuf(siz);
00616 for (Int_t ind=0; ind < siz; ++ind) {
00617 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00618 if(IsNeutrino(part) && IsDocStatus(part)){
00619 neuIndBuf[nNeutrinos]=ind;
00620 neuEBuf[nNeutrinos]=0;
00621 nNeutrinos++;
00622 }
00623 }
00624 neuIndBuf[nNeutrinos]=siz;
00625
00626 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00627 TIter stripitr(csh.GetDaughterIterator());
00628 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00629 TIter digitItr(cstriph->GetDaughterIterator());
00630 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00631 Bool_t found=false;
00632 CandDigitHandle tcdh = *cdh;
00633 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found) {
00634 const DigiSignal * signal = truth.GetSignal(tcdh);
00635 if(signal){
00636 for (UInt_t i=0;i<signal->GetNumberOfHits();i++) {
00637 const DigiScintHit * hit = signal->GetHit(i);
00638 if(hit){
00639 Int_t track = abs(hit->TrackId());
00640 if(track>=neuIndBuf[ind] && track <= neuIndBuf[ind+1]) {
00641 found=true;
00642 }
00643 }
00644 }
00645 }
00646 }
00647 if(found) {
00648 neuEBuf[ind]+=cdh->GetCharge();
00649 }
00650 }
00651 }
00652 }
00653
00654 Float_t PEMax=0;
00655 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00656 if(neuEBuf[ind]>PEMax){
00657 PEMax=neuEBuf[ind];
00658 BestNeu=neuIndBuf[ind];
00659 }
00660 }
00661 PEMax2=0;
00662 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00663 if(neuEBuf[ind] > PEMax2 && neuEBuf[ind] < PEMax) {
00664 PEMax2 = neuEBuf[ind];
00665 }
00666 }
00667 for(Int_t ind=0; ind < nNeutrinos; ++ind) {
00668 TotPE += neuEBuf[ind];
00669 }
00670 }
00671 if(TotPE>0) {
00672 return (PEMax2/TotPE);
00673 } else {
00674 return 0;
00675 }
00676 }
00677
00678 Int_t TruthHelper::NumNeu(CandSliceHandle &csh)
00679 {
00680
00681 const Truthifier & truth = Truthifier::Instance(fMom);
00682
00683 Int_t counter = 0;
00684 Int_t nNeutrinos=0;
00685 SimSnarlRecord *ssr =
00686 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
00687 if (ssr){
00688 const TClonesArray* ctca =
00689 dynamic_cast<const TClonesArray*>
00690 (ssr->FindComponent("TClonesArray","StdHep"));
00691 Int_t siz = ctca->GetEntriesFast();
00692 TArrayI neuIndBuf(siz+1);
00693 TArrayF neuEBuf(siz);
00694 for (Int_t ind=0; ind < siz; ++ind) {
00695 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
00696 if(IsNeutrino(part) && IsDocStatus(part)){
00697 neuIndBuf[nNeutrinos]=ind;
00698 neuEBuf[nNeutrinos]=0;
00699 nNeutrinos++;
00700 }
00701 }
00702 neuIndBuf[nNeutrinos]=siz;
00703
00704 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00705 TIter stripitr(csh.GetDaughterIterator());
00706 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00707 TIter digitItr(cstriph->GetDaughterIterator());
00708 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00709 Bool_t found=false;
00710 CandDigitHandle tcdh = *cdh;
00711 const DigiSignal * signal = truth.GetSignal(tcdh);
00712 if(signal){
00713 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00714 const DigiScintHit * hit = signal->GetHit(i);
00715 if(hit){
00716 Int_t track = abs(hit->TrackId());
00717 if(track>=neuIndBuf[ind] && track <= neuIndBuf[ind+1]){
00718 found=true;
00719 }
00720 }
00721 }
00722 }
00723 if(found) {
00724 neuEBuf[ind]+=cdh->GetCharge();
00725 }
00726 }
00727 }
00728 }
00729 counter = 0;
00730 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
00731 if(neuEBuf[ind]>0){
00732 counter++;
00733 }
00734 }
00735 }
00736 return counter;
00737 }
00738
00739 Float_t TruthHelper::SliceCompleteness(CandSliceHandle & csh)
00740 {
00741 const Truthifier & truth = Truthifier::Instance(fMom);
00742 Int_t neuId=GetBestSliceNeuMatch(csh);
00743 Int_t nextneuId = GetNextNeuId(neuId);
00744 Float_t totalPE=0;
00745 Float_t slicePE=0;
00746 CandRecord *crec = dynamic_cast<CandRecord *>
00747 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00748 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
00749 (crec->FindCandHandle("CandStripListHandle"));
00750 TIter striplistitr(cstriplh->GetDaughterIterator());
00751 striplistitr.Reset();
00752 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
00753 TIter digitItr(cstriph->GetDaughterIterator());
00754 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00755 Bool_t found=false;
00756 const CandDigitHandle tcdh = *cdh;
00757 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00758 const DigiSignal * signal = truth.GetSignal(tcdh);
00759 if(signal){
00760 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00761 const DigiScintHit * hit = signal->GetHit(i);
00762 if(hit){
00763 Int_t track = abs(hit->TrackId());
00764 if(track>=neuId && track<=nextneuId){
00765 found=true;
00766 }
00767 }
00768 }
00769 }
00770 }
00771 if(found) {
00772 totalPE+= cdh->GetCharge();
00773 }
00774 }
00775 }
00776 TIter stripitr(csh.GetDaughterIterator());
00777 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00778 TIter digitItr(cstriph->GetDaughterIterator());
00779 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00780 Bool_t found=false;
00781 const CandDigitHandle tcdh = *cdh;
00782 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00783 const DigiSignal * signal = truth.GetSignal(tcdh);
00784 if(signal){
00785 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00786 const DigiScintHit * hit = signal->GetHit(i);
00787 if(hit){
00788 Int_t track = abs(hit->TrackId());
00789 if(track>=neuId && track<=nextneuId){
00790 found=true;
00791 }
00792 }
00793 }
00794 }
00795 }
00796 if(found) {
00797 slicePE+= cdh->GetCharge();
00798 }
00799 }
00800 }
00801
00802 if(totalPE>0) return (slicePE/totalPE);
00803 return 0.;
00804 }
00805
00806 Int_t TruthHelper::SliceTrueStrip(CandSliceHandle &csh)
00807 {
00808
00809
00810
00811
00812 const Truthifier & truth = Truthifier::Instance(fMom);
00813 Int_t neuId = GetBestSliceNeuMatch(csh);
00814 Int_t nextneuId = GetNextNeuId(neuId);
00815 Int_t truenumber = 0;
00816
00817 CandRecord *crec = dynamic_cast<CandRecord *>
00818 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00819 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
00820 (crec->FindCandHandle("CandStripListHandle"));
00821 TIter stripitr(cstriplh->GetDaughterIterator());
00822 stripitr.Reset();
00823 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00824 TIter digitItr(cstriph->GetDaughterIterator());
00825 Bool_t found=false;
00826 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())) {
00827 CandDigitHandle tcdh = *cdh;
00828 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found) {
00829 const DigiSignal * signal = truth.GetSignal(tcdh);
00830 if(signal){
00831 for (UInt_t i=0;i<signal->GetNumberOfHits();i++) {
00832 const DigiScintHit * hit = signal->GetHit(i);
00833 if(hit){
00834 Int_t track = abs(hit->TrackId());
00835 if(track>=neuId && track<=nextneuId) {
00836 found=true;
00837 }
00838 }
00839 }
00840 }
00841 }
00842 }
00843 if(found) {
00844 truenumber++;
00845 }
00846 }
00847 return truenumber;
00848 }
00849
00850 Float_t TruthHelper::SlicePurity(CandSliceHandle & csh)
00851 {
00852 const Truthifier & truth = Truthifier::Instance(fMom);
00853 Int_t neuId = GetBestSliceNeuMatch(csh);
00854 Int_t nextneuId = GetNextNeuId(neuId);
00855 Float_t totalPE=0;
00856 Float_t hitPE=0;
00857 TIter stripitr(csh.GetDaughterIterator());
00858 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00859 TIter digitItr(cstriph->GetDaughterIterator());
00860 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00861 Bool_t found=false;
00862 CandDigitHandle tcdh = *cdh;
00863 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found) {
00864 const DigiSignal * signal = truth.GetSignal(tcdh);
00865 if(signal){
00866 for (UInt_t i=0;i<signal->GetNumberOfHits();i++) {
00867 const DigiScintHit * hit = signal->GetHit(i);
00868 if(hit) {
00869 Int_t track = abs(hit->TrackId());
00870 if(track>=neuId && track<=nextneuId){
00871 found=true;
00872 }
00873 }
00874 }
00875 }
00876 }
00877 if(found) {
00878 hitPE+=cdh->GetCharge();
00879 totalPE+= cdh->GetCharge();
00880 } else {
00881 if(!truth.DigitIsOnlyCrosstalk(tcdh))
00882 totalPE+= cdh->GetCharge();
00883 }
00884 }
00885 }
00886 if(totalPE>0){
00887 return (hitPE/totalPE);
00888 }
00889 return 0;
00890 }
00891
00892 Float_t TruthHelper::SlicePurity_MaxTimeGap(CandSliceHandle & csh, Int_t mincharge)
00893 {
00894
00895
00896
00897 const Truthifier & truth = Truthifier::Instance(fMom);
00898 Int_t neuId = GetBestSliceNeuMatch(csh);
00899 Int_t nextneuId = GetNextNeuId(neuId);
00900 Float_t totalPE=0;
00901 Float_t hitPE=0;
00902 TIter stripitr(csh.GetDaughterIterator());
00903 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00904 if(cstriph->GetPlane() < 121 && cstriph->GetCharge()>=mincharge) {
00905 TIter digitItr(cstriph->GetDaughterIterator());
00906 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00907 Bool_t found=false;
00908 CandDigitHandle tcdh = *cdh;
00909 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00910 const DigiSignal * signal = truth.GetSignal(tcdh);
00911 if(signal){
00912 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00913 const DigiScintHit * hit = signal->GetHit(i);
00914 if(hit) {
00915 Int_t track = abs(hit->TrackId());
00916 if(track>=neuId && track<=nextneuId){
00917 found=true;
00918 }
00919 }
00920 }
00921 }
00922 }
00923 if(found) {
00924 hitPE+=cdh->GetCharge();
00925 totalPE+= cdh->GetCharge();
00926 } else {
00927 if(!truth.DigitIsOnlyCrosstalk(tcdh))
00928 totalPE+= cdh->GetCharge();
00929 }
00930 }
00931 }
00932 }
00933 if(totalPE>0){
00934 return (hitPE/totalPE);
00935 }
00936 return 0;
00937 }
00938
00939 Float_t TruthHelper::SliceCompleteness_MaxTimeGap(CandSliceHandle & csh, Int_t mincharge)
00940 {
00941
00942 const Truthifier & truth = Truthifier::Instance(fMom);
00943 Int_t neuId=GetBestSliceNeuMatch(csh);
00944 Int_t nextneuId = GetNextNeuId(neuId);
00945 Float_t totalPE=0;
00946 Float_t slicePE=0;
00947 CandRecord *crec = dynamic_cast<CandRecord *>
00948 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00949 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
00950 (crec->FindCandHandle("CandStripListHandle"));
00951 TIter striplistitr(cstriplh->GetDaughterIterator());
00952 striplistitr.Reset();
00953 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
00954 if(cstriph->GetPlane()<121 && cstriph->GetCharge()>=mincharge) {
00955 TIter digitItr(cstriph->GetDaughterIterator());
00956 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00957 Bool_t found=false;
00958 const CandDigitHandle tcdh = *cdh;
00959 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00960 const DigiSignal * signal = truth.GetSignal(tcdh);
00961 if(signal){
00962 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00963 const DigiScintHit * hit = signal->GetHit(i);
00964 if(hit){
00965 Int_t track = abs(hit->TrackId());
00966 if(track>=neuId && track<=nextneuId){
00967 found=true;
00968 }
00969 }
00970 }
00971 }
00972 }
00973 if(found) {
00974 totalPE+= cdh->GetCharge();
00975 }
00976 }
00977 }
00978 }
00979 TIter stripitr(csh.GetDaughterIterator());
00980 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
00981 if(cstriph->GetPlane()<121 && cstriph->GetCharge() >=mincharge) {
00982 TIter digitItr(cstriph->GetDaughterIterator());
00983 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
00984 Bool_t found=false;
00985 const CandDigitHandle tcdh = *cdh;
00986 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
00987 const DigiSignal * signal = truth.GetSignal(tcdh);
00988 if(signal){
00989 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
00990 const DigiScintHit * hit = signal->GetHit(i);
00991 if(hit){
00992 Int_t track = abs(hit->TrackId());
00993 if(track>=neuId && track<=nextneuId){
00994 found=true;
00995 }
00996 }
00997 }
00998 }
00999 }
01000 if(found) {
01001 slicePE+= cdh->GetCharge();
01002 }
01003 }
01004 }
01005 }
01006
01007 if(totalPE>0) return (slicePE/totalPE);
01008 return 0.;
01009 }
01010
01011 Int_t TruthHelper::TruthSliceNum() {
01012
01013
01014
01015
01016 const Truthifier & truth = Truthifier::Instance(fMom);
01017 Int_t nNeutrinos=0;
01018 SimSnarlRecord *ssr =
01019 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01020 if (ssr){
01021 const TClonesArray* ctca =
01022 dynamic_cast<const TClonesArray*>
01023 (ssr->FindComponent("TClonesArray","StdHep"));
01024 Int_t siz = ctca->GetEntriesFast();
01025 TArrayI neuIndBuf(siz+1);
01026 TArrayF neuEBuf(siz);
01027 TArrayF neuEBuf2(siz);
01028 for (Int_t ind=0; ind < siz; ++ind) {
01029 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
01030 if(IsNeutrino(part) && IsDocStatus(part)){
01031 neuIndBuf[nNeutrinos]=ind;
01032 neuEBuf[nNeutrinos]=0;
01033 neuEBuf2[nNeutrinos]=0;
01034 nNeutrinos++;
01035 }
01036 }
01037 neuIndBuf[nNeutrinos]=siz;
01038 CandRecord *crec = dynamic_cast<CandRecord *>
01039 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
01040 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
01041 (crec->FindCandHandle("CandStripListHandle"));
01042
01043 for(Int_t ind=0; ind < nNeutrinos; ++ind) {
01044 TIter striplistitr(cstriplh->GetDaughterIterator());
01045 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
01046 Bool_t found=false;
01047 TIter digitItr(cstriph->GetDaughterIterator());
01048 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01049 const CandDigitHandle tcdh = *cdh;
01050 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
01051 const DigiSignal * signal = truth.GetSignal(tcdh);
01052 if(signal){
01053 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01054 const DigiScintHit * hit = signal->GetHit(i);
01055 if(hit && hit->Plane()<121) {
01056 Int_t track = abs(hit->TrackId());
01057 if(track>=neuIndBuf[ind] && track <= neuIndBuf[ind+1]){
01058 neuEBuf[ind]++;
01059 }
01060 }
01061 }
01062 }
01063 }
01064 }
01065 for(Int_t ind=0; ind < nNeutrinos; ++ind) {
01066 if(neuEBuf[ind]>0) {
01067 neuEBuf2[ind]++;
01068 neuEBuf[ind] = 0;
01069 } else {
01070 neuEBuf[ind] = 0;
01071 }
01072 }
01073 }
01074 }
01075
01076 int counter = 0;
01077 for(int ind=0; ind < nNeutrinos; ++ind) {
01078 if(neuEBuf2[ind] >= 2) counter++;
01079 }
01080
01081 if(counter > 0) {
01082 return counter;
01083 }
01084 return 0;
01085 }
01086 return 0;
01087 }
01088
01089 Float_t TruthHelper::SliceCompleteness_xtalk(CandSliceHandle & csh)
01090 {
01091
01092 const Truthifier & truth = Truthifier::Instance(fMom);
01093 Int_t neuId=GetBestSliceNeuMatch(csh);
01094 Int_t nextneuId = GetNextNeuId(neuId);
01095 Float_t totalPE=0;
01096 Float_t slicePE=0;
01097 CandRecord *crec = dynamic_cast<CandRecord *>
01098 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
01099 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
01100 (crec->FindCandHandle("CandStripListHandle"));
01101 TIter striplistitr(cstriplh->GetDaughterIterator());
01102 striplistitr.Reset();
01103 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
01104 TIter digitItr(cstriph->GetDaughterIterator());
01105 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01106 Bool_t found=false;
01107 const CandDigitHandle tcdh = *cdh;
01108 if(!found){
01109 const DigiSignal * signal = truth.GetSignal(tcdh);
01110 if(signal){
01111 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01112 const DigiScintHit * hit = signal->GetHit(i);
01113 if(hit){
01114 Int_t track = abs(hit->TrackId());
01115 if(track>=neuId && track<=nextneuId) {
01116 found=true;
01117 }
01118 }
01119 }
01120 }
01121 }
01122 if(found) {
01123 totalPE+= cdh->GetCharge();
01124 }
01125 }
01126 }
01127 TIter stripitr(csh.GetDaughterIterator());
01128 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
01129 TIter digitItr(cstriph->GetDaughterIterator());
01130 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01131 Bool_t found=false;
01132 const CandDigitHandle tcdh = *cdh;
01133 if(!found){
01134 const DigiSignal * signal = truth.GetSignal(tcdh);
01135 if(signal){
01136 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01137 const DigiScintHit * hit = signal->GetHit(i);
01138 if(hit){
01139 Int_t track = abs(hit->TrackId());
01140 if(track>=neuId && track<=nextneuId) {
01141 found=true;
01142 }
01143 }
01144 }
01145 }
01146 }
01147 if(found) {
01148 slicePE+= cdh->GetCharge();
01149 }
01150 }
01151 }
01152
01153 if(totalPE>0) return (slicePE/totalPE);
01154 return 0.;
01155 }
01156
01157 Float_t TruthHelper::SlicePurity_xtalk(CandSliceHandle & csh)
01158 {
01159
01160 const Truthifier & truth = Truthifier::Instance(fMom);
01161 Int_t neuId = GetBestSliceNeuMatch(csh);
01162 Int_t nextneuId = GetNextNeuId(neuId);
01163 Float_t totalPE=0;
01164 Float_t hitPE=0;
01165 TIter stripitr(csh.GetDaughterIterator());
01166 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
01167 TIter digitItr(cstriph->GetDaughterIterator());
01168 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01169 Bool_t found=false;
01170 CandDigitHandle tcdh = *cdh;
01171 if(!found){
01172 const DigiSignal * signal = truth.GetSignal(tcdh);
01173 if(signal){
01174 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01175 const DigiScintHit * hit = signal->GetHit(i);
01176 if(hit) {
01177 Int_t track = abs(hit->TrackId());
01178 if(track>=neuId && track<=nextneuId){
01179 found=true;
01180 }
01181 }
01182 }
01183 }
01184 }
01185 if(found) {
01186 hitPE+=cdh->GetCharge();
01187 totalPE+= cdh->GetCharge();
01188 } else {
01189 totalPE+= cdh->GetCharge();
01190 }
01191 }
01192 }
01193 if(totalPE>0){
01194 return (hitPE/totalPE);
01195 }
01196 return 0;
01197 }
01198
01199 Double_t TruthHelper::TrueNeuE(CandSliceHandle & csh)
01200 {
01201
01202
01203 SimSnarlRecord *ssr =
01204 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01205 Int_t ind = GetBestSliceNeuMatch(csh);
01206 if (ssr && ind>=0){
01207 const TClonesArray* ctca =
01208 dynamic_cast<const TClonesArray*>
01209 (ssr->FindComponent("TClonesArray","StdHep"));
01210 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
01211 if(part->Energy() > 0) {
01212 MSG("TruthHelper", Msg::kInfo) << "Neu " << ind << " E is: " << part->Energy() << endl;
01213 return part->Energy();
01214 } else {
01215 return 0.0;
01216 }
01217 } else {
01218 return 0.0;
01219 }
01220 }
01221
01222 Int_t TruthHelper::SliceTrueStripxtalk(CandSliceHandle &csh)
01223 {
01224
01225
01226 const Truthifier & truth = Truthifier::Instance(fMom);
01227 Int_t neuId = GetBestSliceNeuMatch(csh);
01228 Int_t nextneuId = GetNextNeuId(neuId);
01229 Int_t truenumber1 = 0;
01230 CandRecord *crec = dynamic_cast<CandRecord *>
01231 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
01232 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
01233 (crec->FindCandHandle("CandStripListHandle"));
01234 TIter stripitr(cstriplh->GetDaughterIterator());
01235 stripitr.Reset();
01236 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
01237 Bool_t found=false;
01238 TIter digitItr(cstriph->GetDaughterIterator());
01239 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())) {
01240 CandDigitHandle tcdh = *cdh;
01241 if(!found) {
01242 const DigiSignal * signal = truth.GetSignal(tcdh);
01243 if(signal){
01244 for (UInt_t i=0;i<signal->GetNumberOfHits();i++) {
01245 const DigiScintHit * hit = signal->GetHit(i);
01246 if(hit){
01247 Int_t track = abs(hit->TrackId());
01248 if(track>=neuId && track<=nextneuId) {
01249 found=true;
01250 }
01251 }
01252 }
01253 }
01254 }
01255 }
01256 if(found) {
01257 truenumber1++;
01258 }
01259 }
01260 return truenumber1;
01261 }
01262
01263
01264 Float_t TruthHelper::TrackPurity( CandTrackHandle& cth, Int_t trackId)
01265 {
01266 const Truthifier & truth = Truthifier::Instance(fMom);
01267 Float_t total=0;
01268 Float_t hits=0;
01269 SimSnarlRecord *ssr =
01270 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01271 if (ssr){
01272 TIter stripitr(cth.GetDaughterIterator());
01273 while (CandStripHandle* csh = dynamic_cast<CandStripHandle*>(stripitr())) {
01274 TIter digitItr(csh->GetDaughterIterator());
01275 Bool_t found=false;
01276 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01277 CandDigitHandle tcdh = *cdh;
01278 const DigiSignal * signal = truth.GetSignal(tcdh);
01279 if(signal){
01280 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01281 const DigiScintHit * hit = signal->GetHit(i);
01282 if(hit){
01283 Int_t track = abs(hit->TrackId());
01284 if(track==trackId)found=true;
01285 }
01286 }
01287 }
01288 }
01289 total++;
01290 if(found) hits++;
01291 }
01292 }
01293 if(total>0){
01294 return hits/total;
01295 }
01296 return 0.0;
01297 }
01298
01299 Float_t TruthHelper::GetTrackMaxE( CandTrackHandle& cth)
01300 {
01301 Float_t maxE=0;
01302 const Truthifier & truth = Truthifier::Instance(fMom);
01303 Int_t trackId=GetBestTrackIdMatch(cth);
01304 Int_t neuId=GetNeuId(trackId);
01305 Int_t nextneuId = GetNextNeuId(neuId);
01306
01307 SimSnarlRecord *ssr =
01308 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01309 if (ssr){
01310
01311
01312 TIter stripitr(cth.GetDaughterIterator());
01313 while (CandStripHandle* csh = dynamic_cast<CandStripHandle*>(stripitr())) {
01314 TIter digitItr(csh->GetDaughterIterator());
01315 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01316 CandDigitHandle tcdh = *cdh;
01317 const DigiSignal * signal = truth.GetSignal(tcdh);
01318 if(signal){
01319 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01320 const DigiScintHit * hit = signal->GetHit(i);
01321 if(hit){
01322 Int_t track = abs(hit->TrackId());
01323 if(abs(hit->ParticleId())==13){
01324 if(track>neuId && track<nextneuId){
01325 if(hit->ParticleEnergy()>maxE)maxE=hit->ParticleEnergy();
01326 }
01327 }
01328 }
01329 }
01330 }
01331 }
01332 }
01333 }
01334 return maxE;
01335 }
01336
01337 Float_t TruthHelper::GetTrackMaxE2( CandTrackHandle& cth)
01338 {
01339 Float_t maxE=0;
01340 Int_t trackId=GetBestTrackIdMatch(cth);
01341 Int_t neuId=GetNeuId(trackId);
01342 Int_t nextneuId = GetNextNeuId(neuId);
01343
01344 SimSnarlRecord *ssr =
01345 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01346 if (ssr){
01347
01348 const TObjArray * ScintHitArray =
01349 dynamic_cast<const TObjArray*>(ssr->FindComponent(0,"DigiScintHits"));
01350 if(ScintHitArray==0)return maxE;
01351
01352 TIter hitarrayIter(ScintHitArray);
01353 TObject* tobj;
01354 while( (tobj = hitarrayIter.Next()) ) {
01355 const DigiScintHit* hit = dynamic_cast<DigiScintHit*>(tobj);
01356 if(hit){
01357 Int_t track = abs(hit->TrackId());
01358
01359 if(abs(hit->ParticleId())==13 && hit->Plane()<500){
01360 if(track>neuId && track<nextneuId){
01361 if(hit->ParticleEnergy()>maxE)maxE=hit->ParticleEnergy();
01362 }
01363 }
01364 }
01365 }
01366 }
01367 return maxE;
01368 }
01369
01370 Float_t TruthHelper::GetTrackMinE2( CandTrackHandle& cth)
01371 {
01372 Float_t minE=1000;
01373 Int_t trackId=GetBestTrackIdMatch(cth);
01374 Int_t neuId=GetNeuId(trackId);
01375 Int_t nextneuId = GetNextNeuId(neuId);
01376
01377 SimSnarlRecord *ssr =
01378 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01379 if (ssr){
01380
01381
01382 const TObjArray * ScintHitArray =
01383 dynamic_cast<const TObjArray*>(ssr->FindComponent(0,"DigiScintHits"));
01384 if(ScintHitArray==0)return minE;
01385
01386 TIter hitarrayIter(ScintHitArray);
01387 TObject* tobj;
01388 while( (tobj = hitarrayIter.Next()) ) {
01389 const DigiScintHit* hit = dynamic_cast<DigiScintHit*>(tobj);
01390 if(hit){
01391 Int_t track = abs(hit->TrackId());
01392
01393
01394
01395 if(abs(hit->ParticleId())==13 && hit->Plane()<500){
01396 if(track>neuId && track<nextneuId){
01397 if(hit->ParticleEnergy()<minE)minE=hit->ParticleEnergy();
01398 }
01399 }
01400 }
01401 }
01402 }
01403 return minE;
01404 }
01405
01406 Float_t TruthHelper::GetTrackMinE( CandTrackHandle& cth)
01407 {
01408 Float_t minE=10000;
01409 const Truthifier & truth = Truthifier::Instance(fMom);
01410 Int_t trackId= GetBestTrackIdMatch(cth);
01411 Int_t neuId=GetNeuId(trackId);
01412 Int_t nextneuId = GetNextNeuId(neuId);
01413
01414 SimSnarlRecord *ssr =
01415 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01416 if (ssr){
01417
01418 TIter stripitr(cth.GetDaughterIterator());
01419 while (CandStripHandle* csh = dynamic_cast<CandStripHandle*>(stripitr())) {
01420 TIter digitItr(csh->GetDaughterIterator());
01421 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01422 CandDigitHandle tcdh = *cdh;
01423 const DigiSignal * signal = truth.GetSignal(tcdh);
01424 if(signal){
01425 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01426 const DigiScintHit * hit = signal->GetHit(i);
01427 if(hit){
01428 Int_t track = abs(hit->TrackId());
01429 if(abs(hit->ParticleId())==13){
01430 if(track>neuId && track<nextneuId){
01431 if(hit->ParticleEnergy()<minE)minE=hit->ParticleEnergy();
01432 }
01433 }
01434 }
01435 }
01436 }
01437 }
01438 }
01439 }
01440 return minE;
01441 }
01442
01443
01444 Float_t TruthHelper::TrackCompleteness( CandTrackHandle& cth, CandSliceHandle &csh)
01445 {
01446 Float_t ntruehits=0;
01447 Float_t ntrkhits=0;
01448 const Truthifier & truth = Truthifier::Instance(fMom);
01449 Int_t trackId=GetBestTrackIdMatch(cth);
01450
01451 TIter trkstripitr(cth.GetDaughterIterator());
01452
01453 TIter striplistitr(csh.GetDaughterIterator());
01454 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
01455 TIter digitItr(cstriph->GetDaughterIterator());
01456 Bool_t found=false;
01457 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01458 const CandDigitHandle tcdh = *cdh;
01459 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
01460 const DigiSignal * signal = truth.GetSignal(tcdh);
01461 if(signal){
01462 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01463 const DigiScintHit * hit = signal->GetHit(i);
01464 if(hit){
01465 Int_t track = hit->TrackId();
01466 if(track==trackId){
01467 found=true;
01468 }
01469 }
01470 }
01471 }
01472 }
01473 }
01474 if(found) {
01475 ntruehits++;
01476 trkstripitr.Reset();
01477 Int_t plane=cstriph->GetPlane();
01478 Int_t strip=cstriph->GetStrip();
01479 while (CandStripHandle* ctrkstriph = dynamic_cast<CandStripHandle*>(trkstripitr())) {
01480 if(ctrkstriph->GetPlane()==plane && ctrkstriph->GetStrip()==strip){
01481 ntrkhits++;
01482 break;
01483 }
01484 }
01485 }
01486 }
01487 if(ntruehits>0) return (ntrkhits/ntruehits);
01488 return 0.;
01489 }
01490
01491 Float_t TruthHelper::TrackCompleteness( CandTrackHandle& cth)
01492 {
01493 Float_t ntruehits=0;
01494 Float_t ntrkhits=0;
01495 const Truthifier & truth = Truthifier::Instance(fMom);
01496 Int_t trackId= GetBestTrackIdMatch(cth);
01497
01498 TIter trkstripitr(cth.GetDaughterIterator());
01499
01500 CandRecord *crec = dynamic_cast<CandRecord *>
01501 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
01502
01503
01504 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
01505 (crec->FindCandHandle("CandStripListHandle"));
01506
01507 TIter striplistitr(cstriplh->GetDaughterIterator());
01508 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
01509 TIter digitItr(cstriph->GetDaughterIterator());
01510 Bool_t found=false;
01511 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01512 const CandDigitHandle tcdh = *cdh;
01513 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
01514 const DigiSignal * signal = truth.GetSignal(tcdh);
01515 if(signal){
01516 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01517 const DigiScintHit * hit = signal->GetHit(i);
01518 if(hit){
01519 Int_t track = hit->TrackId();
01520 if(track==trackId){
01521 found=true;
01522 }
01523 }
01524 }
01525 }
01526 }
01527 }
01528 if(found) {
01529 ntruehits++;
01530 trkstripitr.Reset();
01531 Int_t plane=cstriph->GetPlane();
01532 Int_t strip=cstriph->GetStrip();
01533 while (CandStripHandle* ctrkstriph = dynamic_cast<CandStripHandle*>(trkstripitr())) {
01534 if(ctrkstriph->GetPlane()==plane && ctrkstriph->GetStrip()==strip){
01535 ntrkhits++;
01536 break;
01537 }
01538 }
01539 }
01540 }
01541 if(ntruehits>0) return ntrkhits/ntruehits;
01542 return 0.;
01543 }
01544
01545 Int_t TruthHelper::GetBestShowerNeuMatch(CandShowerHandle& csh)
01546 {
01547 const Truthifier & truth = Truthifier::Instance(fMom);
01548 Int_t BestNeu=-1;
01549 Int_t nNeutrinos=0;
01550 SimSnarlRecord *ssr =
01551 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01552 if (ssr){
01553 const TClonesArray* ctca =
01554 dynamic_cast<const TClonesArray*>
01555 (ssr->FindComponent("TClonesArray","StdHep"));
01556 Int_t siz = ctca->GetEntriesFast();
01557 TArrayI neuIndBuf(siz+1);
01558 TArrayF neuEBuf(siz);
01559 for (Int_t ind=0; ind < siz; ++ind) {
01560 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
01561 if(IsNeutrino(part) && IsDocStatus(part)) {
01562 neuIndBuf[nNeutrinos]=ind;
01563 neuEBuf[nNeutrinos]=0;
01564 nNeutrinos++;
01565 }
01566 }
01567 neuIndBuf[nNeutrinos]=siz;
01568
01569 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
01570 TIter stripitr(csh.GetDaughterIterator());
01571 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
01572 TIter digitItr(cstriph->GetDaughterIterator());
01573 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01574 Bool_t found=false;
01575 CandDigitHandle tcdh = *cdh;
01576 const DigiSignal * signal = truth.GetSignal(tcdh);
01577 if(signal){
01578 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01579 const DigiScintHit * hit = signal->GetHit(i);
01580 if(hit){
01581 Int_t track = abs(hit->TrackId());
01582 if(track>=neuIndBuf[ind] && track <= neuIndBuf[ind+1]){
01583 found=true;
01584 }
01585 }
01586 }
01587 }
01588 if(found) {
01589 neuEBuf[ind]+=cdh->GetCharge();
01590 }
01591 }
01592 }
01593 }
01594 Float_t PEMax=0;
01595 for (Int_t ind=0; ind < nNeutrinos; ++ind) {
01596 if(neuEBuf[ind]>PEMax){
01597 PEMax=neuEBuf[ind];
01598 BestNeu=neuIndBuf[ind];
01599 }
01600 }
01601 }
01602 return BestNeu;
01603 }
01604
01605 Float_t TruthHelper::ShowerPurity( CandShowerHandle& csh, Int_t neuId)
01606 {
01607 const Truthifier & truth = Truthifier::Instance(fMom);
01608 Int_t nextneuId = GetNextNeuId(neuId);
01609 Float_t totalPE=0;
01610 Float_t hitPE=0;
01611
01612 TIter stripitr(csh.GetDaughterIterator());
01613 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(stripitr())) {
01614 TIter digitItr(cstriph->GetDaughterIterator());
01615 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01616 Bool_t found=false;
01617 CandDigitHandle tcdh = *cdh;
01618 const DigiSignal * signal = truth.GetSignal(tcdh);
01619 if(signal){
01620 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01621 const DigiScintHit * hit = signal->GetHit(i);
01622 if(hit){
01623 Int_t track = abs(hit->TrackId());
01624 if(track>=neuId && track<=nextneuId){
01625 found=true;
01626 }
01627 }
01628 }
01629 }
01630 if(found) {
01631 hitPE+=cdh->GetCharge();
01632 totalPE+= cdh->GetCharge();
01633 } else {
01634 totalPE+= cdh->GetCharge();
01635 }
01636 }
01637 }
01638
01639 if(totalPE>0){
01640 return hitPE/totalPE;
01641 }
01642 return 0.;
01643 }
01644
01645 Float_t TruthHelper::ShowerCompleteness( CandShowerHandle& cshwh, CandSliceHandle &csh)
01646 {
01647 return ShowerCompletenessImp(cshwh, &csh, false);
01648 }
01649
01650
01651 Float_t TruthHelper::ShowerCompleteness( CandShowerHandle& cshwh)
01652 {
01653 return ShowerCompletenessImp(cshwh, 0, false);
01654 }
01655
01656 Float_t TruthHelper::ShowerCompletenessAllStrips(CandShowerHandle& cshwh,
01657 CandSliceHandle &csh)
01658 {
01659 return ShowerCompletenessImp(cshwh, &csh, true);
01660 }
01661
01662
01663 Float_t TruthHelper::ShowerCompletenessAllStrips( CandShowerHandle& cshwh)
01664 {
01665 return ShowerCompletenessImp(cshwh, 0, true);
01666 }
01667
01668 Float_t TruthHelper::ShowerCompletenessImp(CandShowerHandle& cshwh,
01669 CandSliceHandle* csh,
01670 bool useAllStrips)
01671 {
01672 Float_t truePE=0;
01673 Float_t shwPE=0;
01674 const Truthifier & truth = Truthifier::Instance(fMom);
01675 Int_t neuId= GetBestShowerNeuMatch(cshwh);
01676 Int_t nextneuId= GetNextNeuId(neuId);
01677
01678 SimSnarlRecord *ssr =
01679 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01680 if (!ssr)return 0.0;
01681 const TClonesArray* ctca =
01682 dynamic_cast<const TClonesArray*>
01683 (ssr->FindComponent("TClonesArray","StdHep"));
01684
01685 TIter shwstripitr(cshwh.GetDaughterIterator());
01686
01687
01688
01689 TIter striplistitr((TIterator*)0);
01690
01691 if(csh) {
01692
01693 striplistitr=csh->GetDaughterIterator();
01694 } else {
01695
01696 CandRecord *crec = dynamic_cast<CandRecord *>
01697 (fMom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
01698
01699 CandStripListHandle *cstriplh = dynamic_cast<CandStripListHandle *>
01700 (crec->FindCandHandle("CandStripListHandle"));
01701 striplistitr=cstriplh->GetDaughterIterator();
01702 }
01703
01704 while (CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplistitr())) {
01705
01706
01707
01708
01709
01710
01711
01712 if ((!useAllStrips) &&
01713 cstriph->GetCharge(CalDigitType::kPE)<cshwh.GetMinStripPE()) continue;
01714
01715 TIter digitItr(cstriph->GetDaughterIterator());
01716 Bool_t found=false;
01717 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01718 const CandDigitHandle tcdh = *cdh;
01719 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
01720 const DigiSignal * signal = truth.GetSignal(tcdh);
01721 if(signal){
01722 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01723 const DigiScintHit * hit = signal->GetHit(i);
01724 if(hit){
01725 Int_t track = abs(hit->TrackId());
01726 TParticle* part = dynamic_cast<TParticle*>((*ctca)[track]);
01727
01728 if(track>neuId && track<nextneuId && IsPrimaryShowerPart(part)){
01729 found=true;
01730 }
01731 }
01732 }
01733 }
01734 }
01735 }
01736 if(found) {
01737 truePE+=cstriph->GetCharge();
01738 shwstripitr.Reset();
01739 Int_t plane=cstriph->GetPlane();
01740 Int_t strip=cstriph->GetStrip();
01741 while (CandStripHandle* cshwstriph = dynamic_cast<CandStripHandle*>(shwstripitr())) {
01742 if(cshwstriph->GetPlane()==plane && cshwstriph->GetStrip()==strip){
01743 shwPE+=cstriph->GetCharge();
01744 break;
01745 }
01746 }
01747 }
01748 }
01749 if(truePE>0) return shwPE/truePE;
01750 return 0.;
01751
01752 }
01753
01754 Int_t TruthHelper::Stripxtalk(CandStripHandle *csh)
01755 {
01756
01757 const Truthifier & truth = Truthifier::Instance(fMom);
01758 SimSnarlRecord *ssr =
01759 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01760 Int_t flag = 0;
01761 if (ssr){
01762 TIter digitItr(csh->GetDaughterIterator());
01763 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())) {
01764 CandDigitHandle tcdh = *cdh;
01765 if(truth.DigitIsOnlyCrosstalk(tcdh)) {
01766 flag = 1;
01767 } else {
01768 flag = 0;
01769 }
01770 }
01771 }
01772 return flag;
01773 }
01774
01775 Float_t TruthHelper::StripPurity(CandStripHandle *csh)
01776 {
01777
01778 const Truthifier & truth = Truthifier::Instance(fMom);
01779 Int_t nNeutrinos=0;
01780 Int_t totalnum = 0;
01781 SimSnarlRecord *ssr =
01782 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01783 if (ssr){
01784 const TClonesArray* ctca =
01785 dynamic_cast<const TClonesArray*>
01786 (ssr->FindComponent("TClonesArray","StdHep"));
01787 Int_t siz = ctca->GetEntriesFast();
01788 TArrayI neuIndBuf(siz+1);
01789 TArrayF neuEBuf(siz);
01790 for (Int_t ind=0; ind < siz; ++ind) {
01791 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
01792 if(IsNeutrino(part) && part->GetStatusCode()==0){
01793 neuIndBuf[nNeutrinos]=ind;
01794 neuEBuf[nNeutrinos]=0;
01795 nNeutrinos++;
01796 }
01797 }
01798 neuIndBuf[nNeutrinos]=siz;
01799
01800 TIter digitItr(csh->GetDaughterIterator());
01801 while (CandDigitHandle *cdh = dynamic_cast<CandDigitHandle*>(digitItr())){
01802 Bool_t found=false;
01803 CandDigitHandle tcdh = *cdh;
01804 if(!truth.DigitIsOnlyCrosstalk(tcdh) && !found){
01805 const DigiSignal * signal = truth.GetSignal(tcdh);
01806 if(signal){
01807 for (UInt_t i=0;i<signal->GetNumberOfHits();i++){
01808 const DigiScintHit * hit = signal->GetHit(i);
01809 if(hit) {
01810 Int_t track = abs(hit->TrackId());
01811 for(Int_t y=0; y<nNeutrinos; y++) {
01812 if(track>=neuIndBuf[y] && track<=neuIndBuf[y+1]) {
01813 neuEBuf[y]++;
01814 }
01815 }
01816 }
01817 }
01818 }
01819 }
01820 }
01821
01822 for(Int_t y=0; y<nNeutrinos; y++) {
01823 if(neuEBuf[y]>0) totalnum++;
01824 }
01825
01826 if(totalnum>0) {
01827 return totalnum;
01828 }
01829 }
01830 return 0;
01831 }
01832
01833
01834 Int_t TruthHelper::GetClosestNeuVtx(CandRecoHandle& crh)
01835 {
01836 Int_t bestNeu=-1;
01837 Float_t vtxU=crh.GetVtxU();
01838 Float_t vtxV=crh.GetVtxV();
01839 Float_t vtxX=0.707*(vtxU-vtxV);
01840 Float_t vtxY=0.707*(vtxU+vtxV);
01841 Float_t vtxZ=crh.GetVtxZ();
01842 Float_t closestDist=1e6;
01843 SimSnarlRecord *ssr =
01844 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01845 if (ssr){
01846 const TClonesArray* ctca =
01847 dynamic_cast<const TClonesArray*>
01848 (ssr->FindComponent("TClonesArray","StdHep"));
01849 Int_t siz = ctca->GetEntriesFast();
01850 for (Int_t ind=0; ind < siz; ++ind) {
01851 TParticle* part = dynamic_cast<TParticle*>((*ctca)[ind]);
01852 if(IsNeutrino(part) && IsDocStatus(part)){
01853 Float_t dist= sqrt((vtxX-part->Vx())*(vtxX-part->Vx())+
01854 (vtxY-part->Vy())*(vtxY-part->Vy())+
01855 (vtxZ-part->Vz())*(vtxZ-part->Vz()));
01856 if(dist<closestDist){
01857 closestDist=dist;
01858 bestNeu=ind;
01859 }
01860 }
01861 }
01862 }
01863 return bestNeu;
01864 }
01865
01866 const Float_t * TruthHelper::GetP4Neu(Int_t neuId){
01867
01868 for(Int_t i=0;i<4;i++) m_p4Neu[i]=0.;
01869 if(neuId<0)return m_p4Neu;
01870 SimSnarlRecord *ssr =
01871 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01872 if (ssr){
01873 const TClonesArray* ctca =
01874 dynamic_cast<const TClonesArray*>
01875 (ssr->FindComponent("TClonesArray","StdHep"));
01876 TParticle* part = dynamic_cast<TParticle*>((*ctca)[neuId]);
01877 if(IsNeutrino(part) ){
01878 m_p4Neu[0]=part->Px();
01879 m_p4Neu[1]=part->Py();
01880 m_p4Neu[2]=part->Pz();
01881 m_p4Neu[3]=part->Energy();
01882 }
01883 else{
01884
01885 MSG("TruthHelper",Msg::kWarning) << "Non-neutrino stdhep entry interrigated to obtain Neu 4 vector" << endl;
01886 }
01887 }
01888 return m_p4Neu;
01889 }
01890
01891 const Float_t * TruthHelper::GetP4Shw(Int_t neuId){
01892 for(Int_t i=0;i<4;i++) m_p4Shw[i]=0.;
01893 if(neuId<0)return m_p4Shw;
01894 Int_t nextneu = GetNextNeuId(neuId);
01895 SimSnarlRecord *ssr =
01896 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01897 if (ssr){
01898 const TClonesArray* ctca =
01899 dynamic_cast<const TClonesArray*>
01900 (ssr->FindComponent("TClonesArray","StdHep"));
01901 TParticle* neu = dynamic_cast<TParticle*>((*ctca)[neuId]);
01902 if(IsNeutrino(neu)){
01903 for (Int_t i=neuId;i<nextneu ; i++){
01904 TParticle* part = dynamic_cast<TParticle*>((*ctca)[i]);
01905 if( !IsNeutrino(part) && !IsMuon(part) && part->GetStatusCode()==1){
01906 m_p4Shw[0]+=part->Px();
01907 m_p4Shw[1]+=part->Py();
01908 m_p4Shw[2]+=part->Pz();
01909 m_p4Shw[3]+=part->Energy();
01910 if((part->GetPdgCode()/1000)%10 || part->GetPdgCode()>99999) m_p4Shw[3]-=part->GetMass();
01911 }
01912 }
01913 }
01914 }
01915 return m_p4Shw;
01916 }
01917
01918 const Float_t * TruthHelper::GetP4Mu1(Int_t neuId){
01919
01920
01921 for(Int_t i=0;i<4;i++) m_p4Mu1[i]=0;
01922 if(neuId<0)return m_p4Mu1;
01923 Int_t nextneu = GetNextNeuId(neuId);
01924 SimSnarlRecord *ssr =
01925 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01926 if (ssr){
01927 const TClonesArray* ctca =
01928 dynamic_cast<const TClonesArray*>
01929 (ssr->FindComponent("TClonesArray","StdHep"));
01930 TParticle* neu = dynamic_cast<TParticle*>((*ctca)[neuId]);
01931 if(IsNeutrino(neu)){
01932 for (Int_t i=neuId;i<nextneu ; i++){
01933 TParticle* part = dynamic_cast<TParticle*>((*ctca)[i]);
01934 if(IsMuon(part)){
01935 Float_t p[4];
01936 p[0]=part->Px();
01937 p[1]=part->Py();
01938 p[2]=part->Pz();
01939 p[3]=part->Energy();
01940 if(p[3]>m_p4Mu1[3]){
01941 m_p4Mu1[0]=p[0];
01942 m_p4Mu1[1]=p[1];
01943 m_p4Mu1[2]=p[2];
01944 m_p4Mu1[3]=p[3];
01945 }
01946 }
01947 }
01948 }
01949 }
01950 return m_p4Mu1;
01951 }
01952
01953 const Float_t * TruthHelper::GetP4Mu2(Int_t neuId){
01954
01955 const Float_t * mu1E = GetP4Mu1(neuId);
01956 for(Int_t i=0;i<4;i++) m_p4Mu2[i]=0;
01957 if(neuId<0)return m_p4Mu2;
01958 Int_t nextneu = GetNextNeuId(neuId);
01959 SimSnarlRecord *ssr =
01960 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01961 if (ssr){
01962 const TClonesArray* ctca =
01963 dynamic_cast<const TClonesArray*>
01964 (ssr->FindComponent("TClonesArray","StdHep"));
01965 TParticle* neu = dynamic_cast<TParticle*>((*ctca)[neuId]);
01966 if(IsNeutrino(neu)){
01967 for (Int_t i=neuId;i<nextneu ; i++){
01968 TParticle* part = dynamic_cast<TParticle*>((*ctca)[i]);
01969 if(IsMuon(part) && part->Energy()!=mu1E[3]){
01970 Float_t p[4];
01971 p[0]=part->Px();
01972 p[1]=part->Py();
01973 p[2]=part->Pz();
01974 p[3]=part->Energy();
01975 if(p[3]>m_p4Mu2[3]){
01976 m_p4Mu2[0]=p[0];
01977 m_p4Mu2[1]=p[1];
01978 m_p4Mu2[2]=p[2];
01979 m_p4Mu2[3]=p[3];
01980 }
01981 }
01982 }
01983 }
01984 }
01985 return m_p4Mu2;
01986 }
01987
01988
01989 const Float_t * TruthHelper::GetP4El1(Int_t neuId){
01990
01991 for(Int_t i=0;i<4;i++) m_p4El1[i]=0;
01992 if(neuId<0) return m_p4El1;
01993 Int_t nextneu = GetNextNeuId(neuId);
01994 SimSnarlRecord *ssr =
01995 dynamic_cast<SimSnarlRecord*>(fMom->GetFragment("SimSnarlRecord"));
01996 if (ssr){
01997 const TClonesArray* ctca =
01998 dynamic_cast<const TClonesArray*>
01999 (ssr->FindComponent("TClonesArray","StdHep"));
02000 TParticle* neu = dynamic_cast<TParticle*>((*ctca)[neuId]);
02001 if(IsNeutrino(neu)){
02002 for (Int_t i=neuId;i<nextneu ; i++){
02003 TParticle* part = dynamic_cast<TParticle*>((*ctca)[i]);
02004 if(IsElectron(part)){
02005 Float_t p[4];
02006 p[0]=part->Px();
02007 p[1]=part->Py();
02008 p[2]=part->Pz();
02009 p[3]=part->Energy();
02010 if(p[3]>m_p4El1[3]){
02011 m_p4El1[0]=p[0];
02012 m_p4El1[1]=p[1];
02013 m_p4El1[2]=p[2];
02014 m_p4El1[3]=p[3];
02015 }
02016 }
02017 }
02018 }
02019 }
02020 return m_p4El1;
02021 }