00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00053
00054 #include "TClonesArray.h"
00055
00056 #include "BeamDataNtuple/NtpBDLiteRecord.h"
00057 #include "CandNtupleSR/NtpSREvent.h"
00058 #include "CandNtupleSR/NtpSRMomentum.h"
00059 #include "CandNtupleSR/NtpSRShower.h"
00060 #include "CandNtupleSR/NtpSRTrack.h"
00061 #include "CandNtupleSR/NtpSRVertex.h"
00062 #include "Conventions/Munits.h"
00063 #include "DataUtil/GetDetector.h"
00064 #include "DataUtil/PlaneOutline.h"
00065
00066
00067 #include "MessageService/MsgService.h"
00068 #include "MinosObjectMap/MomNavigator.h"
00069 #include "NtupleUtils/NuCuts.h"
00070 #include "Plex/PlexPlaneId.h"
00071 #include "StandardNtuple/NtpStRecord.h"
00072 #include "Validity/VldContext.h"
00073
00074 #include "NtupleUtils/SRMom.h"
00075
00076
00077 #include <cmath>
00078 #include <cstdlib>
00079
00080 using std::multimap;
00081
00082 ClassImp(SRMom)
00083
00084 CVSID("$Id: SRMom.cxx,v 1.8 2009/02/28 21:46:14 gmieg Exp $");
00085
00086
00087 SRMom::SRMom()
00088 : fbeamType(BeamType::kLE)
00089 {
00090 fmom = 0;
00091 fstRecord = 0;
00092 fbdLiteRec = 0;
00093
00094
00095
00096
00097
00098
00099 }
00100
00101
00102 SRMom::SRMom(const MomNavigator* mom)
00103 : fbeamType(BeamType::kLE)
00104 {
00105 fmom = mom;
00106 if (!fmom){
00107 MSG("SRMom",Msg::kWarning)
00108 << "No Mom in this snarl" << endl;
00109 fstRecord = 0;
00110 fbdLiteRec = 0;
00111 }
00112
00113 else{
00114 fstRecord = dynamic_cast<NtpStRecord*>
00115 (fmom->GetFragment("NtpStRecord"));
00116 if (!fstRecord){
00117 MSG("SRMom",Msg::kWarning)
00118 << "No NtpStRecord in Mom" << endl;
00119 }
00120
00121 fbdLiteRec = dynamic_cast<NtpBDLiteRecord*>
00122 (fmom->GetFragment("NtpBDLiteRecord"));
00123 if (!fbdLiteRec){
00124 MAXMSG("SRMom",Msg::kWarning, 10)
00125 << "No NtpBDLiteRecord in Mom" << endl;
00126 }
00127 }
00128
00129
00130
00131
00132
00133
00134
00135 }
00136
00137
00138 SRMom::~SRMom()
00139 {
00140 fbdLiteRec = 0;
00141 fstRecord = 0;
00142 fmom = 0;
00143
00144
00145
00146
00147
00148
00149 }
00150
00151
00152 const multimap<Float_t, Float_t> SRMom::ArrayRAlongTrack(const Int_t eventNum,
00153 const Int_t trackNum) const
00154 {
00155 multimap<Float_t, Float_t> md;
00156 md.clear();
00157 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00158 if (!srTrack){
00159 MSG("SRMom",Msg::kWarning)
00160 << "No NtpSRTrack number " << trackNum
00161 << " in event number " << eventNum << endl;
00162 return md;
00163 }
00164 for (Int_t k=0; k<srTrack->nstrip; ++k){
00165
00166 Float_t x = srTrack->stpx[k];
00167 Float_t y = srTrack->stpy[k];
00168 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00169 sqrt(x*x + y*y)));
00170 }
00171 return md;
00172 }
00173
00174
00175 const multimap<Float_t, Float_t> SRMom::ArrayUAlongTrack(const Int_t eventNum,
00176 const Int_t trackNum) const
00177 {
00178 multimap<Float_t, Float_t> md;
00179 md.clear();
00180 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00181 if (!srTrack){
00182 MSG("SRMom",Msg::kWarning)
00183 << "No NtpSRTrack number " << trackNum
00184 << " in event number " << eventNum << endl;
00185 return md;
00186 }
00187 for (Int_t k=0; k<srTrack->nstrip; ++k){
00188
00189 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00190 srTrack->stpu[k]));
00191 }
00192 return md;
00193 }
00194
00195
00196 const multimap<Float_t, Float_t> SRMom::ArrayVAlongTrack(const Int_t eventNum,
00197 const Int_t trackNum) const
00198 {
00199 multimap<Float_t, Float_t> md;
00200 md.clear();
00201 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00202 if (!srTrack){
00203 MSG("SRMom",Msg::kWarning)
00204 << "No NtpSRTrack number " << trackNum
00205 << " in event number " << eventNum << endl;
00206 return md;
00207 }
00208 for (Int_t k=0; k<srTrack->nstrip; ++k){
00209
00210 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00211 srTrack->stpv[k]));
00212 }
00213 return md;
00214 }
00215
00216
00217 const multimap<Float_t, Float_t> SRMom::ArrayXAlongTrack(const Int_t eventNum,
00218 const Int_t trackNum) const
00219 {
00220 multimap<Float_t, Float_t> md;
00221 md.clear();
00222 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00223 if (!srTrack){
00224 MSG("SRMom",Msg::kWarning)
00225 << "No NtpSRTrack number " << trackNum
00226 << " in event number " << eventNum << endl;
00227 return md;
00228 }
00229
00230 for (Int_t k=0; k<srTrack->nstrip; ++k){
00231
00232
00233 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00234 srTrack->stpx[k]));
00235 }
00236
00237
00238
00239
00240
00241
00242
00243 return md;
00244 }
00245
00246
00247 const multimap<Float_t, Float_t>
00248 SRMom::ArrayXAlongTrack(const NtpSRTrack* srTrack) const
00249 {
00250 multimap<Float_t, Float_t> md;
00251 md.clear();
00252 if (!srTrack){
00253 MSG("SRMom",Msg::kWarning)
00254 << "No NtpSRTrack passed to SRMom::ArrayXAlongTrack" << endl;
00255 return md;
00256 }
00257
00258 for (Int_t k=0; k<srTrack->nstrip; ++k){
00259 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00260 srTrack->stpx[k]));
00261 }
00262 return md;
00263 }
00264
00265
00266 const multimap<Float_t, Float_t> SRMom::ArrayYAlongTrack(const Int_t eventNum,
00267 const Int_t trackNum) const
00268 {
00269 multimap<Float_t, Float_t> md;
00270 md.clear();
00271 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00272 if (!srTrack){
00273 MSG("SRMom",Msg::kWarning)
00274 << "No NtpSRTrack number " << trackNum
00275 << " in event number " << eventNum << endl;
00276 return md;
00277 }
00278 for (Int_t k=0; k<srTrack->nstrip; ++k){
00279
00280 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00281 srTrack->stpy[k]));
00282 }
00283 return md;
00284 }
00285
00286
00287 const multimap<Float_t, Float_t>
00288 SRMom::ArrayYAlongTrack(const NtpSRTrack* srTrack) const
00289 {
00290 multimap<Float_t, Float_t> md;
00291 md.clear();
00292 if (!srTrack){
00293 MSG("SRMom",Msg::kWarning)
00294 << "No NtpSRTrack passed to SRMom::ArrayYAlongTrack" << endl;
00295 return md;
00296 }
00297 for (Int_t k=0; k<srTrack->nstrip; ++k){
00298 md.insert(pair<Float_t,Float_t>(srTrack->stpz[k],
00299 srTrack->stpy[k]));
00300 }
00301 return md;
00302 }
00303
00304
00305 const Int_t SRMom::BiggestShwIndex(const Int_t eventNum) const
00306 {
00307 Float_t highestPH = 0.0;
00308 Int_t biggestShwIndex = -1;
00309 Int_t numShowers = this->NumShowers(eventNum);
00310 if (numShowers < 1){return -1;}
00311
00312 for (Int_t j=0; j<numShowers; ++j){
00313 Float_t ph = this->ShwPHGeV(eventNum,j);
00314 if (ph > highestPH){
00315 highestPH = ph;
00316 biggestShwIndex = j;
00317 }
00318 }
00319 if (-1 == biggestShwIndex){
00320 MSG("SRMom",Msg::kWarning)
00321 << "Showers in event " << eventNum << " have -ve energy." << endl;
00322 }
00323 return biggestShwIndex;
00324 }
00325
00326
00327 const Float_t SRMom::ChiSq(const Int_t eventNum,
00328 const Int_t trackNum) const
00329 {
00330 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00331 if (!srTrack){
00332 MSG("SRMom",Msg::kWarning)
00333 << "No NtpSRTrack number " << trackNum
00334 << " in event number " << eventNum << endl;
00335 return -1.0;
00336 }
00337 if (!srTrack->fit.pass) return -1.0;
00338
00339 return srTrack->fit.chi2;
00340 }
00341
00342
00343 const Float_t SRMom::ChiSqPerNDoF(const Int_t eventNum,
00344 const Int_t trackNum) const
00345 {
00346 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00347 if (!srTrack){
00348 MSG("SRMom",Msg::kWarning)
00349 << "No NtpSRTrack number " << trackNum
00350 << " in event number " << eventNum << endl;
00351 return -1.0;
00352 }
00353 if (!srTrack->fit.pass) return -1.0;
00354 if (!srTrack->fit.ndof) return -1.0;
00355
00356 return srTrack->fit.chi2/srTrack->fit.ndof;
00357 }
00358
00359
00360 const Detector::Detector_t SRMom::Detector() const
00361 {
00362 const VldContext* vc = this->VldCntxt();
00363 if (!vc){return Detector::kUnknown;}
00364 return vc->GetDetector();
00365 }
00366
00367
00368 const Int_t SRMom::EvtLthPln(const Int_t eventNum) const
00369 {
00370 const NtpSREvent* srEvent = this->SREvent(eventNum);
00371 if(!srEvent){
00372 MSG("SRMom",Msg::kWarning)
00373 << "No NtpSREvent with event number " << eventNum << endl;
00374 return -1;
00375 }
00376
00377 return abs((Int_t) (srEvent->vtx.plane) -
00378 (Int_t) (srEvent->end.plane));
00379 }
00380
00381
00382 const NtpSRVertex* SRMom::EvtVtx(const Int_t eventNum) const
00383 {
00384 const NtpSREvent* srEvent = this->SREvent(eventNum);
00385 if(!srEvent){
00386 MSG("SRMom",Msg::kWarning)
00387 << "No NtpSREvent with event number " << eventNum << endl;
00388 return 0;
00389 }
00390
00391 return &(srEvent->vtx);
00392 }
00393
00394
00395 const Int_t SRMom::EventVtxPlane(const Int_t eventNum) const
00396 {
00397 const NtpSREvent* srEvent = this->SREvent(eventNum);
00398 if(!srEvent){
00399 MSG("SRMom",Msg::kWarning)
00400 << "No NtpSREvent with event number " << eventNum << endl;
00401 return -1;
00402 }
00403
00404 return srEvent->vtx.plane;
00405 }
00406
00407
00408 const Float_t SRMom::EventVtxU(const Int_t eventNum) const
00409 {
00410 const NtpSREvent* srEvent = this->SREvent(eventNum);
00411 if(!srEvent){
00412 MSG("SRMom",Msg::kWarning)
00413 << "No NtpSREvent with event number " << eventNum << endl;
00414 return -1;
00415 }
00416
00417 return srEvent->vtx.u;
00418 }
00419
00420
00421 const Float_t SRMom::EventVtxV(const Int_t eventNum) const
00422 {
00423 const NtpSREvent* srEvent = this->SREvent(eventNum);
00424 if(!srEvent){
00425 MSG("SRMom",Msg::kWarning)
00426 << "No NtpSREvent with event number " << eventNum << endl;
00427 return -1;
00428 }
00429
00430 return srEvent->vtx.v;
00431 }
00432
00433
00434 const Float_t SRMom::EventVtxX(const Int_t eventNum) const
00435 {
00436 const NtpSREvent* srEvent = this->SREvent(eventNum);
00437 if(!srEvent){
00438 MSG("SRMom",Msg::kWarning)
00439 << "No NtpSREvent with event number " << eventNum << endl;
00440 return -1;
00441 }
00442
00443 return srEvent->vtx.x;
00444 }
00445
00446
00447 const Float_t SRMom::EventVtxY(const Int_t eventNum) const
00448 {
00449 const NtpSREvent* srEvent = this->SREvent(eventNum);
00450 if(!srEvent){
00451 MSG("SRMom",Msg::kWarning)
00452 << "No NtpSREvent with event number " << eventNum << endl;
00453 return -1;
00454 }
00455
00456 return srEvent->vtx.y;
00457 }
00458
00459
00460 const Float_t SRMom::EventVtxZ(const Int_t eventNum) const
00461 {
00462 const NtpSREvent* srEvent = this->SREvent(eventNum);
00463 if(!srEvent){
00464 MSG("SRMom",Msg::kWarning)
00465 << "No NtpSREvent with event number " << eventNum << endl;
00466 return -1;
00467 }
00468
00469 return srEvent->vtx.z;
00470 }
00471
00472
00473 const Bool_t SRMom::LISnarl() const
00474 {
00475 if (!fstRecord){return false;}
00476 if (-1.0 == fstRecord->evthdr.litime){return false;}
00477 else {return true;}
00478 }
00479
00480
00481 const Int_t SRMom::LongestTrackIndex(const Int_t eventNum) const
00482 {
00483 Float_t longestLength = 0.0;
00484 Int_t longestIndex = -1;
00485 Int_t numTracks = this->NumTracks(eventNum);
00486 if (numTracks < 1){return -1;}
00487
00488 for (Int_t j=0; j<numTracks; ++j){
00489 Float_t length = this->TrackLength(eventNum,j);
00490 if (length > longestLength){
00491 longestLength = length;
00492 longestIndex = j;
00493 }
00494 }
00495 if (-1 == longestIndex){
00496 MSG("SRMom",Msg::kWarning)
00497 << "Tracks in event " << eventNum << " have -ve length." << endl;
00498 }
00499 return longestIndex;
00500 }
00501
00502
00503 const NtpSRTrack* SRMom::LongestTrackInEvent(const Int_t eventNum) const
00504 {
00505 Float_t longestLength = 0.0;
00506 Int_t longestIndex = -1;
00507 Int_t numTracks = this->NumTracks(eventNum);
00508 if (numTracks < 1){return 0;}
00509
00510 for (Int_t j=0; j<numTracks; ++j){
00511 Float_t length = this->TrackLength(eventNum,j);
00512 if (length > longestLength){
00513 longestLength = length;
00514 longestIndex = j;
00515 }
00516 }
00517 if (-1 == longestIndex){
00518 MSG("SRMom",Msg::kWarning)
00519 << "Tracks in event " << eventNum << " have -ve length." << endl;
00520 return 0;
00521 }
00522 return this->SRTrack(eventNum, longestIndex);
00523 }
00524
00525
00526 const Int_t SRMom::NDoF(const Int_t eventNum,
00527 const Int_t trackNum) const
00528 {
00529 const NtpSRTrack* srTrack = SRTrack(eventNum, trackNum);
00530 if (!srTrack){
00531 MSG("SRMom",Msg::kWarning)
00532 << "No NtpSRTrack number " << trackNum
00533 << " in event number " << eventNum << endl;
00534 return -1;
00535 }
00536 if (!srTrack->fit.pass) return -1;
00537
00538 return srTrack->fit.ndof;
00539 }
00540
00541
00542 const Int_t SRMom::NumEvents() const
00543 {
00544 if (!fstRecord){return -1;}
00545
00546 TClonesArray* srArray = fstRecord->evt;
00547
00548 TIter digitIter(srArray);
00549 NtpSREvent* srEvent;
00550 Int_t numEvents = 0;
00551 while ( (srEvent = dynamic_cast<NtpSREvent*> (digitIter.Next()) ) ){
00552 numEvents++;
00553 }
00554
00555 return numEvents;
00556 }
00557
00558
00559 const Int_t SRMom::NumShowers(const Int_t eventNum) const
00560 {
00561 const NtpSREvent* srEvent = this->SREvent(eventNum);
00562 if(!srEvent){
00563 MSG("SRMom",Msg::kWarning)
00564 << "No NtpSREvent with event number " << eventNum << endl;
00565 return -1;
00566 }
00567
00568 return srEvent->nshower;
00569 }
00570
00571
00572 const Int_t SRMom::NumTracks(const Int_t eventNum) const
00573 {
00574 const NtpSREvent* srEvent = this->SREvent(eventNum);
00575 if(!srEvent){
00576 MSG("SRMom",Msg::kWarning)
00577 << "No NtpSREvent with event number " << eventNum << endl;
00578 return -1;
00579 }
00580
00581 return srEvent->ntrack;
00582 }
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600 const Int_t SRMom::RunNumber() const
00601 {
00602 return fstRecord->GetHeader().GetRun();
00603 }
00604
00605
00606 const Int_t SRMom::SnarlNumber() const
00607 {
00608 return fstRecord->GetHeader().GetSnarl();
00609 }
00610
00611
00612 const Float_t SRMom::SnarlPoT() const
00613 {
00614 if (!fbdLiteRec){return 0;}
00615 return fbdLiteRec->tortgt;
00616 }
00617
00618
00619 const Int_t SRMom::ShwEndPln(const Int_t eventNum,
00620 const Int_t shwNum) const
00621 {
00622 const NtpSRShower* srShower = this->SRShower(eventNum,shwNum);
00623 if (!srShower){
00624 MSG("SRMom",Msg::kWarning)
00625 << "No NtpSRShower number " << shwNum
00626 << " in event number " << eventNum<< endl;
00627 return 0;
00628 }
00629 return (Int_t) srShower->plane.end;
00630 }
00631
00632
00633 const Int_t SRMom::ShwLthPlanes(const Int_t eventNum,
00634 const Int_t shwNum) const
00635 {
00636 const NtpSRShower* srShower = this->SRShower(eventNum,shwNum);
00637 if (!srShower){
00638 MSG("SRMom",Msg::kWarning)
00639 << "No NtpSRShower number " << shwNum
00640 << " in event number " << eventNum<< endl;
00641 return 0;
00642 }
00643 return abs(((Int_t) srShower->plane.end)
00644 - ((Int_t) srShower->plane.beg));
00645 }
00646
00647
00648 const Float_t SRMom::ShwPHGeV(const Int_t eventNum,
00649 const Int_t shwNum) const
00650 {
00651 const NtpSRShower* srShower = this->SRShower(eventNum,shwNum);
00652 if (!srShower){
00653 MSG("SRMom",Msg::kWarning)
00654 << "No NtpSRShower number " << shwNum
00655 << " in event number " << eventNum<< endl;
00656 return 0.0;
00657 }
00658 return srShower->ph.gev;
00659 }
00660
00661
00662 const NtpSRVertex* SRMom::ShwStartVtx(const Int_t eventNum,
00663 const Int_t shwNum) const
00664 {
00665 const NtpSRShower* srShower = this->SRShower(eventNum,shwNum);
00666 if (!srShower){
00667 MSG("SRMom",Msg::kWarning)
00668 << "No NtpSRShower number " << shwNum
00669 << " in event number " << eventNum<< endl;
00670 return 0;
00671 }
00672 return &(srShower->vtx);
00673 }
00674
00675
00676 const NtpSREvent* SRMom::SREvent(const Int_t eventNum) const
00677 {
00678
00679
00680
00681
00682
00683 if (!fstRecord){
00684
00685
00686
00687
00688
00689
00690 return 0;
00691 }
00692 TClonesArray& srArray = *(fstRecord->evt);
00693 NtpSREvent* srEvent = dynamic_cast<NtpSREvent*> (srArray[eventNum]);
00694
00695
00696
00697
00698
00699
00700 return srEvent;
00701 }
00702
00703
00704 const NtpSRShower* SRMom::SRShower(const Int_t eventNum,
00705 const Int_t shwNum) const
00706 {
00707 if (shwNum < 0){return 0;}
00708 if (shwNum >= this->NumShowers(eventNum)){return 0;}
00709
00710 const NtpSREvent* srEvent = this->SREvent(eventNum);
00711 if (!srEvent){
00712 MSG("SRMom",Msg::kWarning)
00713 << "No NtpSREvent with event number " << eventNum << endl;
00714 return 0;
00715 }
00716
00717 Int_t shwIndex = srEvent->shw[shwNum];
00718 TClonesArray& shwArray = *(fstRecord->shw);
00719 NtpSRShower* shower = dynamic_cast<NtpSRShower*>
00720 (shwArray[shwIndex]);
00721 return shower;
00722 }
00723
00724
00725 const NtpSRTrack* SRMom::SRTrack(const Int_t eventNum,
00726 const Int_t trackNum) const
00727 {
00728
00729
00730
00731
00732
00733
00734 const NtpSREvent* srEvent = this->SREvent(eventNum);
00735 if (!srEvent){
00736 MSG("SRMom",Msg::kWarning)
00737 << "No NtpSREvent with event number " << eventNum << endl;
00738
00739
00740
00741
00742
00743 return 0;
00744 }
00745
00746 Int_t trackIndex = srEvent->trk[trackNum];
00747 TClonesArray& trackArray = *(fstRecord->trk);
00748 NtpSRTrack* track = dynamic_cast<NtpSRTrack*>
00749 (trackArray[trackIndex]);
00750
00751
00752
00753
00754
00755 return track;
00756 }
00757
00758
00759 const Int_t SRMom::TrkContained(const Int_t eventNum,
00760 const Int_t trackNum) const
00761 {
00762 Float_t dOut = this->TrackEndDistOuterTransEdge(eventNum,trackNum);
00763 Float_t dz = this->TrackEndDistZEnd(eventNum,trackNum);
00764 if (dOut < -999990){return -1;}
00765 if (dz < -999990){return -1;}
00766 if (dOut < 0.2){return 0;}
00767 if (dz < 0.2){return 0;}
00768 return 1;
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780 }
00781
00782
00783 const Float_t SRMom::TrackEndDistOuterTransEdge(const Int_t eventNum,
00784 const Int_t trackNum) const
00785 {
00786 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00787 if (!srTrack){
00788 MSG("SRMom",Msg::kWarning)
00789 << "No NtpSRTrack number " << trackNum
00790 << " in event number " << eventNum << endl;
00791 return -999999.9;
00792 }
00793
00794 const Int_t endPln = this->TrackEndPlane(srTrack);
00795 if (endPln < 0){
00796 MSG("SRMom",Msg::kWarning)
00797 << "Trying to find TrackEndDistOuterTransEdge for a plane "
00798 << "before the start of the detector."
00799 << endl;
00800 return -999999.9;
00801 }
00802 PlexPlaneId planeID(DataUtil::GetDetector(*fmom),
00803 (UInt_t) endPln);
00804
00805 Float_t distance = 0;
00806 Float_t xdist = 0;
00807 Float_t ydist = 0;
00808 PlaneOutline plnout;
00809 plnout.DistanceToOuterEdge(this->TrackEndX(srTrack),
00810 this->TrackEndY(srTrack),
00811 planeID.GetPlaneView(),
00812 planeID.GetPlaneCoverage(),
00813 distance,
00814 xdist,
00815 ydist);
00816 return distance;
00817 }
00818
00819
00820 const Float_t SRMom::TrackEndDistZEnd(const Int_t eventNum,
00821 const Int_t trackNum) const
00822 {
00823 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00824 if (!srTrack){
00825 MSG("SRMom",Msg::kWarning)
00826 << "No NtpSRTrack number " << trackNum
00827 << " in event number " << eventNum << endl;
00828 return -999999.9;
00829 }
00830
00831 Detector::Detector_t det = DataUtil::GetDetector(*fmom);
00832 Float_t detLength = 282*5.94*Munits::cm;
00833 if (Detector::kFar == det){
00834 detLength = 484*5.94*Munits::cm;
00835 }
00836 else{
00837 if (Detector::kNear != det){
00838 MSG("SRMom",Msg::kWarning)
00839 << "Trying to find TrkEndDistZEnd for non-existant detector."
00840 << endl;
00841 return -999999.9;
00842 }
00843 }
00844 return detLength - srTrack->end.z;
00845 }
00846
00847
00848 const Int_t SRMom::TrackEndPlane(const Int_t eventNum,
00849 const Int_t trackNum) const
00850 {
00851 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00852 if (!srTrack){
00853 MSG("SRMom",Msg::kWarning)
00854 << "No NtpSRTrack number " << trackNum
00855 << " in event number " << eventNum << endl;
00856 return -1;
00857 }
00858 return srTrack->end.plane;
00859 }
00860
00861
00862 const Int_t SRMom::TrackEndPlane(const NtpSRTrack* srTrack) const
00863 {
00864 if (!srTrack){
00865 MSG("SRMom",Msg::kWarning)
00866 << "Trying to find TrackEndPlane for a null track." << endl;
00867 return -1;
00868 }
00869 return srTrack->end.plane;
00870 }
00871
00872
00873 const Float_t SRMom::TrkEndR(const Int_t eventNum,
00874 const Int_t trackNum) const
00875 {
00876 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00877 if (!srTrack){
00878 MSG("SRMom",Msg::kWarning)
00879 << "No NtpSRTrack number " << trackNum
00880 << " in event number " << eventNum << endl;
00881 return -999999.9;
00882 }
00883 Float_t x = srTrack->end.x;
00884 Float_t y = srTrack->end.y;
00885 Float_t r = sqrt(x*x + y*y);
00886 return r;
00887 }
00888
00889
00890 const Float_t SRMom::TrackEndU(const Int_t eventNum,
00891 const Int_t trackNum) const
00892 {
00893 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00894 if (!srTrack){
00895 MSG("SRMom",Msg::kWarning)
00896 << "No NtpSRTrack number " << trackNum
00897 << " in event number " << eventNum << endl;
00898 return -999999.9;
00899 }
00900 return srTrack->end.u;
00901 }
00902
00903
00904 const Float_t SRMom::TrackEndV(const Int_t eventNum,
00905 const Int_t trackNum) const
00906 {
00907 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00908 if (!srTrack){
00909 MSG("SRMom",Msg::kWarning)
00910 << "No NtpSRTrack number " << trackNum
00911 << " in event number " << eventNum << endl;
00912 return -999999.9;
00913 }
00914 return srTrack->end.v;
00915 }
00916
00917
00918 const Float_t SRMom::TrackEndX(const Int_t eventNum,
00919 const Int_t trackNum) const
00920 {
00921 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00922 if (!srTrack){
00923 MSG("SRMom",Msg::kWarning)
00924 << "No NtpSRTrack number " << trackNum
00925 << " in event number " << eventNum << endl;
00926 return -999999.9;
00927 }
00928 return srTrack->end.x;
00929 }
00930
00931
00932 const Float_t SRMom::TrackEndX(const NtpSRTrack* srTrack) const
00933 {
00934 if (!srTrack){
00935 MSG("SRMom",Msg::kWarning)
00936 << "Trying to find TrackEndX for a null track." << endl;
00937 return -999999.9;
00938 }
00939 return srTrack->end.x;
00940 }
00941
00942
00943 const Float_t SRMom::TrackEndY(const Int_t eventNum,
00944 const Int_t trackNum) const
00945 {
00946 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00947 if (!srTrack){
00948 MSG("SRMom",Msg::kWarning)
00949 << "No NtpSRTrack number " << trackNum
00950 << " in event number " << eventNum << endl;
00951 return -999999.9;
00952 }
00953 return srTrack->end.y;
00954 }
00955
00956
00957 const Float_t SRMom::TrackEndY(const NtpSRTrack* srTrack) const
00958 {
00959 if (!srTrack){
00960 MSG("SRMom",Msg::kWarning)
00961 << "Trying to find TrackEndY for a null track." << endl;
00962 return -999999.9;
00963 }
00964 return srTrack->end.y;
00965 }
00966
00967
00968 const Float_t SRMom::TrackEndZ(const Int_t eventNum,
00969 const Int_t trackNum) const
00970 {
00971 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
00972 if (!srTrack){
00973 MSG("SRMom",Msg::kWarning)
00974 << "No NtpSRTrack number " << trackNum
00975 << " in event number " << eventNum << endl;
00976 return -999999.9;
00977 }
00978 return srTrack->end.z;
00979 }
00980
00981
00982 const Float_t SRMom::TrkEnergySimple(const Int_t eventNum,
00983 const Int_t trackNum) const
00984 {
00985
00986 Int_t contained = this->TrkContained(eventNum,trackNum);
00987 if (-1.0 == contained){
00988 return -999999.9;
00989 }
00990 if (!contained){
00991 return this->TrkMomCurv(eventNum,trackNum);
00992 }
00993 return TrkMomRange(eventNum,trackNum);
00994 }
00995
00996
00997 const Int_t SRMom::TrkFitPass(const Int_t eventNum,
00998 const Int_t trackNum) const
00999 {
01000 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01001 if (!srTrack){
01002 MSG("SRMom",Msg::kWarning)
01003 << "No NtpSRTrack number " << trackNum
01004 << " in event number " << eventNum << endl;
01005 return -1;
01006 }
01007 return (Int_t) srTrack->fit.pass;
01008 }
01009
01010
01011 const Float_t SRMom::TrackLength(const Int_t eventNum,
01012 const Int_t trackNum) const
01013 {
01014 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01015 if (!srTrack){
01016 MSG("SRMom",Msg::kWarning)
01017 << "No NtpSRTrack number " << trackNum
01018 << " in event number " << eventNum << endl;
01019 return -1.0;
01020 }
01021 Float_t trackLength = srTrack->ds;
01022 return trackLength;
01023 }
01024
01025
01026 const Int_t SRMom::TrackLengthPlanes(const Int_t eventNum,
01027 const Int_t trackNum) const
01028 {
01029 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01030 if (!srTrack){
01031 MSG("SRMom",Msg::kWarning)
01032 << "No NtpSRTrack number " << trackNum
01033 << " in event number " << eventNum << endl;
01034 return -1;
01035 }
01036 Int_t vtxPlane = TrackVtxPlane(srTrack);
01037 Int_t endPlane = TrackEndPlane(srTrack);
01038 if (-1 == endPlane || -1 == vtxPlane){return -1;}
01039 Int_t trackLength = endPlane - vtxPlane;
01040 return trackLength;
01041 }
01042
01043
01044 const Int_t SRMom::TrackLengthPlanes(const NtpSRTrack* srTrack) const
01045 {
01046 if (!srTrack){
01047 MSG("SRMom",Msg::kWarning)
01048 << "No NtpSRTrack given to SRMom::TrkLthPln" << endl;
01049 return -1;
01050 }
01051 Int_t vtxPlane = TrackVtxPlane(srTrack);
01052 Int_t endPlane = TrackEndPlane(srTrack);
01053 if (-1 == endPlane || -1 == vtxPlane){return -1;}
01054 Int_t trackLength = endPlane - vtxPlane;
01055 return trackLength;
01056 }
01057
01058
01059 const Float_t SRMom::TrkMomCurv(const Int_t eventNum,
01060 const Int_t trackNum) const
01061 {
01062 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01063 if (!srTrack){
01064 MSG("SRMom",Msg::kWarning)
01065 << "No NtpSRTrack number " << trackNum
01066 << " in event number " << eventNum << endl;
01067 return -999999.9;
01068 }
01069 Float_t qOvp = srTrack->momentum.qp;
01070 if (!qOvp) return -999999.9;
01071 return fabs(1.0/qOvp);
01072 }
01073
01074
01075 const Float_t SRMom::TrkMomRange(const Int_t eventNum,
01076 const Int_t trackNum) const
01077 {
01078 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01079 if (!srTrack){
01080 MSG("SRMom",Msg::kWarning)
01081 << "No NtpSRTrack number " << trackNum
01082 << " in event number " << eventNum << endl;
01083 return -999999.9;
01084 }
01085 return srTrack->momentum.range;
01086 }
01087
01088
01089 const Int_t SRMom::TrkNumPln(const Int_t eventNum,
01090 const Int_t trackNum) const
01091 {
01092 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01093 if (!srTrack){
01094 MSG("SRMom",Msg::kWarning)
01095 << "No NtpSRTrack number " << trackNum
01096 << " in event number " << eventNum << endl;
01097 return -1;
01098 }
01099 return srTrack->plane.n;
01100 }
01101
01102
01103 const Int_t SRMom::TrackNumStrips(const Int_t eventNum,
01104 const Int_t trackNum) const
01105 {
01106 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01107 if (!srTrack){
01108 MSG("SRMom",Msg::kWarning)
01109 << "No NtpSRTrack number " << trackNum
01110 << " in event number " << eventNum << endl;
01111 return -1;
01112 }
01113 return srTrack->nstrip;
01114 }
01115
01116
01117 const NtpSRVertex* SRMom::TrkStartVtx(const Int_t eventNum,
01118 const Int_t trackNum) const
01119 {
01120 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01121 if (!srTrack){
01122 MSG("SRMom",Msg::kWarning)
01123 << "No NtpSRTrack number " << trackNum
01124 << " in event number " << eventNum << endl;
01125 return 0;
01126 }
01127 return &(srTrack->vtx);
01128 }
01129
01130
01131 const Int_t SRMom::TrackVtxPlane(const Int_t eventNum,
01132 const Int_t trackNum) const
01133 {
01134 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01135 if (!srTrack){
01136 MSG("SRMom",Msg::kWarning)
01137 << "No NtpSRTrack number " << trackNum
01138 << " in event number " << eventNum << endl;
01139 return -1;
01140 }
01141 return srTrack->vtx.plane;
01142 }
01143
01144
01145 const Int_t SRMom::TrackVtxPlane(const NtpSRTrack* srTrack) const
01146 {
01147 if (!srTrack){
01148 MSG("SRMom",Msg::kWarning)
01149 << "Trying to find TrackEndX for a null track." << endl;
01150 return -1;
01151 }
01152 return srTrack->vtx.plane;
01153 }
01154
01155
01156 const Float_t SRMom::TrackVtxQOvP(const Int_t eventNum,
01157 const Int_t trackNum) const
01158 {
01159 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01160 if (!srTrack){
01161 MSG("SRMom",Msg::kWarning)
01162 << "No NtpSRTrack number " << trackNum
01163 << " in event number " << eventNum << endl;
01164 return -999999.9;
01165 }
01166 return srTrack->momentum.qp;
01167 }
01168
01169
01170 const Float_t SRMom::TrackVtxQOvP(const NtpSRTrack* srTrack) const
01171 {
01172 if (!srTrack){
01173 MSG("SRMom",Msg::kWarning)
01174 << "No NtpSRTrack given to SRMom::TrackVtxQOvP" << endl;
01175 return -999999.9;
01176 }
01177 return srTrack->momentum.qp;
01178 }
01179
01180
01181 const Float_t SRMom::TrackVtxQOvPError(const Int_t eventNum,
01182 const Int_t trackNum) const
01183 {
01184 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01185 if (!srTrack){
01186 MSG("SRMom",Msg::kWarning)
01187 << "No NtpSRTrack number " << trackNum
01188 << " in event number " << eventNum << endl;
01189 return -999999.9;
01190 }
01191 return srTrack->momentum.eqp;
01192 }
01193
01194
01195 const Float_t SRMom::TrkVtxR(const Int_t eventNum,
01196 const Int_t trackNum) const
01197 {
01198 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01199 if (!srTrack){
01200 MSG("SRMom",Msg::kWarning)
01201 << "No NtpSRTrack number " << trackNum
01202 << " in event number " << eventNum << endl;
01203 return -999999.9;
01204 }
01205 Float_t x = srTrack->vtx.x;
01206 Float_t y = srTrack->vtx.y;
01207 Float_t r = sqrt(x*x + y*y);
01208 return r;
01209 }
01210
01211
01212 const Float_t SRMom::TrackVtxX(const Int_t eventNum,
01213 const Int_t trackNum) const
01214 {
01215 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01216 if (!srTrack){
01217 MSG("SRMom",Msg::kWarning)
01218 << "No NtpSRTrack number " << trackNum
01219 << " in event number " << eventNum << endl;
01220 return -999999.9;
01221 }
01222 return srTrack->vtx.x;
01223 }
01224
01225
01226 const Float_t SRMom::TrackVtxY(const Int_t eventNum,
01227 const Int_t trackNum) const
01228 {
01229 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01230 if (!srTrack){
01231 MSG("SRMom",Msg::kWarning)
01232 << "No NtpSRTrack number " << trackNum
01233 << " in event number " << eventNum << endl;
01234 return -999999.9;
01235 }
01236 return srTrack->vtx.y;
01237 }
01238
01239
01240 const Float_t SRMom::TrackVtxZ(const Int_t eventNum,
01241 const Int_t trackNum) const
01242 {
01243 const NtpSRTrack* srTrack = this->SRTrack(eventNum, trackNum);
01244 if (!srTrack){
01245 MSG("SRMom",Msg::kWarning)
01246 << "No NtpSRTrack number " << trackNum
01247 << " in event number " << eventNum << endl;
01248 return -999999.9;
01249 }
01250 return srTrack->vtx.z;
01251 }
01252
01253
01254 const VldContext* SRMom::VldCntxt() const
01255 {
01256 if (!fstRecord){
01257 return 0;
01258 }
01259 return fstRecord->GetVldContext();
01260 }
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305