00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #include <cassert>
00014 #include <cmath>
00015 #include <iostream>
00016 #include <map>
00017
00018 #include "Conventions/CalDigitType.h"
00019 #include "MessageService/MsgService.h"
00020 #include "RecoBase/CandRecoHandle.h"
00021 #include "RecoBase/CandEventHandle.h"
00022 #include "RecoBase/CandEvent.h"
00023 #include "RecoBase/CandSliceHandle.h"
00024 #include "RecoBase/CandShowerHandle.h"
00025 #include "RecoBase/CandTrackHandle.h"
00026 #include "DataUtil/PlaneOutline.h"
00027 #include "UgliGeometry/UgliGeomHandle.h"
00028 #include "Validity/VldContext.h"
00029
00030
00031 ClassImp(CandEventHandle)
00032
00033
00034 CVSID("$Id: CandEventHandle.cxx,v 1.36 2006/12/01 20:19:16 rhatcher Exp $");
00035
00036
00037 CandEventHandle::CandEventHandle()
00038 {
00039 }
00040
00041
00042 CandEventHandle::CandEventHandle(const CandEventHandle &cdh) :
00043 CandRecoHandle(cdh)
00044 {
00045 }
00046
00047
00048 CandEventHandle::CandEventHandle(CandEvent *cd) :
00049 CandRecoHandle(cd)
00050 {
00051 }
00052
00053
00054 CandEventHandle::~CandEventHandle()
00055 {
00056 }
00057
00058
00059 CandEventHandle *CandEventHandle::DupHandle() const
00060 {
00061 return (new CandEventHandle(*this));
00062 }
00063
00064
00065
00066 void CandEventHandle::Trace(const char *c) const
00067 {
00068 MSG("Cand", Msg::kDebug)
00069 << "**********Begin CandEventHandle::Trace(\"" << c << "\")" << endl
00070 << "Information from CandEventHandle's CandHandle: " << endl;
00071 CandHandle::Trace(c);
00072 MSG("Cand", Msg::kDebug)
00073 << "**********End CandEventHandle::Trace(\"" << c << "\")" << endl;
00074 }
00075
00076
00077 void CandEventHandle::SetCandSlice(const CandSliceHandle *slice)
00078 {
00079 if (slice) {
00080 CandSliceHandle *ch = slice->DupHandle();
00081 delete (dynamic_cast<CandEvent *>(GetOwnedCandBase()))->fCandSlice;
00082 dynamic_cast<CandEvent *>(GetOwnedCandBase())->fCandSlice = ch;
00083 }
00084 }
00085
00086
00087 const CandSliceHandle *CandEventHandle::GetCandSlice() const
00088 {
00089 return dynamic_cast<const CandEvent *>(GetCandBase())->fCandSlice;
00090 }
00091
00092 NavKey CandEventHandle::KeyFromSlice(const CandEventHandle *event)
00093 {
00094 if (event->GetCandSlice()) {
00095 return static_cast<Int_t>(event->GetCandSlice()->GetUidInt());
00096 }
00097 return 0;
00098 }
00099
00100
00101
00102 Int_t CandEventHandle::GetLastShower() const
00103 {
00104 return
00105 dynamic_cast<const CandEvent*>(GetCandBase())->fShowerList.GetLast();
00106 }
00107
00108
00109 Int_t CandEventHandle::GetLastTrack() const
00110 {
00111 return
00112 dynamic_cast<const CandEvent*>(GetCandBase())->fTrackList.GetLast();
00113 }
00114
00115
00116 CandShowerHandle *CandEventHandle::GetPrimaryShower() const
00117 {
00118 return dynamic_cast<const CandEvent*>(GetCandBase())->fPrimaryShower;
00119 }
00120
00121
00122 CandTrackHandle *CandEventHandle::GetPrimaryTrack() const
00123 {
00124 return dynamic_cast<const CandEvent*>(GetCandBase())->fPrimaryTrack;
00125 }
00126
00127
00128 Int_t CandEventHandle::GetPrimaryShowerIndex() const
00129 {
00130
00131 if(!GetPrimaryShower()) return -1;
00132 const TObjArray &showerlist =
00133 (dynamic_cast<const CandEvent*>(GetCandBase()))->fShowerList;
00134 for (Int_t i=0; i<=showerlist.GetLast(); i++) {
00135 CandShowerHandle *shower =
00136 dynamic_cast<CandShowerHandle*>(showerlist.At(i));
00137 CandShowerHandle * primaryshower = GetPrimaryShower();
00138 if (*primaryshower == *shower) {
00139 return i;
00140 }
00141 }
00142 return -1;
00143 }
00144
00145
00146 Int_t CandEventHandle::GetPrimaryTrackIndex() const
00147 {
00148 if(!GetPrimaryTrack()) return -1;
00149
00150 const TObjArray &tracklist =
00151 (dynamic_cast<const CandEvent*>(GetCandBase()))->fTrackList;
00152 for (Int_t i=0; i<= tracklist.GetLast(); i++) {
00153 CandTrackHandle *track =
00154 dynamic_cast<CandTrackHandle*>(tracklist.At(i));
00155 CandTrackHandle * primarytrack = GetPrimaryTrack();
00156 if ( *primarytrack == *track) {
00157 return i;
00158 }
00159 }
00160 return -1;
00161 }
00162
00163
00164 const CandShowerHandle *CandEventHandle::GetShower(Int_t i) const
00165 {
00166 const TObjArray *fShowerList =
00167 &(dynamic_cast<const CandEvent*>(GetCandBase())->fShowerList);
00168 if (i>fShowerList->GetLast()) {
00169 return 0;
00170 }
00171 return dynamic_cast<const CandShowerHandle*>(fShowerList->At(i));
00172 }
00173
00174
00175 CandShowerHandle *CandEventHandle::GetShowerWritable(Int_t i)
00176 {
00177 const TObjArray *fShowerList =
00178 &(dynamic_cast<const CandEvent*>(GetOwnedCandBase())->fShowerList);
00179 if (i>fShowerList->GetLast()) {
00180 return 0;
00181 }
00182 return dynamic_cast<CandShowerHandle*>(fShowerList->At(i));
00183 }
00184
00185
00186 const CandTrackHandle *CandEventHandle::GetTrack(Int_t i) const
00187 {
00188 const TObjArray *fTrackList =
00189 &(dynamic_cast<const CandEvent*>(GetCandBase())->fTrackList);
00190 if (i>fTrackList->GetLast()) {
00191 return 0;
00192 }
00193 return dynamic_cast<const CandTrackHandle*>(fTrackList->At(i));
00194 }
00195
00196 void CandEventHandle::SetPrimaryShower(const CandShowerHandle * primaryshower){
00197
00198 const TObjArray &showerlist =
00199 (dynamic_cast<CandEvent*>(GetCandBase()))->fShowerList;
00200 Bool_t found=0;
00201 Int_t iprimary = -1;
00202 for (Int_t i=0; i<=showerlist.GetLast() && !found; i++) {
00203 CandShowerHandle *shower =
00204 dynamic_cast<CandShowerHandle*>(showerlist.At(i));
00205 if (*primaryshower == *shower) {
00206 found = 1;
00207 iprimary = i;
00208 }
00209 }
00210 if (iprimary>0) {
00211 CandShowerHandle *shower =
00212 dynamic_cast<CandShowerHandle*>(showerlist.At(iprimary));
00213 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fShowerList.
00214 AddAt(showerlist.At(0), iprimary);
00215 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fShowerList.
00216 AddAt(shower, 0);
00217 }
00218 CandShowerHandle *ch = primaryshower->DupHandle();
00219 delete (dynamic_cast<CandEvent *>
00220 (GetOwnedCandBase()))->fPrimaryShower;
00221 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryShower = ch;
00222
00223 }
00224
00225 void CandEventHandle::SetPrimaryShower(Double_t minShwEFract, Double_t minShwShwDZ)
00226 {
00227
00228 CandTrackHandle *primarytrack = 0;
00229 if(!GetPrimaryTrack())SetPrimaryTrack();
00230 primarytrack = GetPrimaryTrack();
00231 const TObjArray &showerlist =
00232 (dynamic_cast<CandEvent*>(GetCandBase()))->fShowerList;
00233
00234
00235
00236 CandShowerHandle *closestshower = 0;
00237 CandShowerHandle *largestshower = 0;
00238 CandShowerHandle *primaryshower = 0;
00239 Float_t largestenergy=-1;
00240 Float_t closestenergy=-1;
00241 Float_t dzlargest=0;
00242 Float_t dzclosest=1e6;
00243
00244
00245 for (Int_t i=0; i<=showerlist.GetLast(); i++) {
00246 CandShowerHandle *shower =
00247 dynamic_cast<CandShowerHandle*>(showerlist.At(i));
00248 if (!largestshower || shower->GetEnergy()>largestenergy) {
00249 largestenergy = shower->GetEnergy();
00250 largestshower = shower;
00251 if(primarytrack)dzlargest = fabs(shower->GetVtxZ()-primarytrack->GetVtxZ());
00252 }
00253 if(primarytrack){
00254 if(fabs(shower->GetVtxZ()-primarytrack->GetVtxZ())<dzclosest){
00255 dzclosest=fabs(shower->GetVtxZ()-primarytrack->GetVtxZ());
00256 closestshower=shower;
00257 closestenergy=shower->GetEnergy();
00258 }
00259 }
00260 }
00261
00262
00263
00264 float eratio = 1.;
00265 if(largestenergy>0) eratio = closestenergy/largestenergy;
00266 if(closestshower && (dzlargest-dzclosest)>minShwShwDZ && eratio>minShwEFract){
00267 primaryshower = closestshower;
00268 }
00269
00270 else{
00271 primaryshower = largestshower;
00272 }
00273
00274 if(primaryshower && primaryshower->GetEnergy()<2*Munits::GeV){
00275 if(primarytrack){
00276 if(fabs(primarytrack->GetVtxZ()-primaryshower->GetVtxZ())>0.5*Munits::m)
00277 primaryshower = 0;
00278 }
00279 }
00280 if(!primaryshower){
00281 delete (dynamic_cast<CandEvent *>
00282 (GetOwnedCandBase()))->fPrimaryShower;
00283 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryShower = 0;
00284 return;
00285 }
00286
00287 Bool_t found=0;
00288 Int_t iprimary = -1;
00289 for (Int_t i=0; i<=showerlist.GetLast() && !found; i++) {
00290 CandShowerHandle *shower =
00291 dynamic_cast<CandShowerHandle*>(showerlist.At(i));
00292 if (*primaryshower == *shower) {
00293 found = 1;
00294 iprimary = i;
00295 }
00296 }
00297 if (iprimary>0) {
00298 CandShowerHandle *shower =
00299 dynamic_cast<CandShowerHandle*>(showerlist.At(iprimary));
00300 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fShowerList.
00301 AddAt(showerlist.At(0), iprimary);
00302 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fShowerList.
00303 AddAt(shower, 0);
00304 }
00305 CandShowerHandle *ch = primaryshower->DupHandle();
00306 delete (dynamic_cast<CandEvent *>
00307 (GetOwnedCandBase()))->fPrimaryShower;
00308 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryShower = ch;
00309
00310 }
00311
00312 void CandEventHandle::SetPrimaryTrack(const CandTrackHandle * primarytrack){
00313
00314 const TObjArray &tracklist =
00315 (dynamic_cast<CandEvent*>(GetCandBase()))->fTrackList;
00316
00317 Bool_t found(0);
00318 Int_t iprimary=-1;
00319 for (Int_t i=0; i<=tracklist.GetLast() && !found; i++) {
00320 CandTrackHandle *track =
00321 dynamic_cast<CandTrackHandle*>(tracklist.At(i));
00322
00323 if (*primarytrack == *track) {
00324 found = 1;
00325 iprimary = i;
00326 }
00327 }
00328
00329
00330 if (iprimary>0) {
00331 CandTrackHandle *track =
00332 dynamic_cast<CandTrackHandle*>(tracklist.At(iprimary));
00333 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fTrackList.
00334 AddAt(tracklist.At(0), iprimary);
00335 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fTrackList.
00336 AddAt(track, 0);
00337 }
00338 if (primarytrack) {
00339 CandTrackHandle *ch = primarytrack->DupHandle();
00340 delete (dynamic_cast<CandEvent *>
00341 (GetOwnedCandBase()))->fPrimaryTrack;
00342 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryTrack = ch;
00343 }
00344 else {
00345 delete (dynamic_cast<CandEvent *>
00346 (GetOwnedCandBase()))->fPrimaryTrack;
00347 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryTrack = 0;
00348 }
00349
00350 }
00351
00352 void CandEventHandle::SetPrimaryTrack()
00353 {
00354
00355 const TObjArray &tracklist =
00356 (dynamic_cast<CandEvent*>(GetCandBase()))->fTrackList;
00357
00358 Double_t bestscore=0;
00359 Bool_t found(0);
00360 Int_t iprimary=-1;
00361 CandTrackHandle *primarytrack=0;
00362
00363 for (Int_t i=0; i<=tracklist.GetLast() && !found; i++) {
00364 CandTrackHandle *track =
00365 dynamic_cast<CandTrackHandle*>(tracklist.At(i));
00366
00367 if (!primarytrack || track->GetScore()>bestscore) {
00368 primarytrack = track;
00369 bestscore=track->GetScore();
00370 found = 1;
00371 iprimary = i;
00372 }
00373 }
00374
00375 if (iprimary>0) {
00376 CandTrackHandle *track =
00377 dynamic_cast<CandTrackHandle*>(tracklist.At(iprimary));
00378 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fTrackList.
00379 AddAt(tracklist.At(0), iprimary);
00380 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fTrackList.
00381 AddAt(track, 0);
00382 }
00383 if (primarytrack) {
00384 CandTrackHandle *ch = primarytrack->DupHandle();
00385 delete (dynamic_cast<CandEvent *>
00386 (GetOwnedCandBase()))->fPrimaryTrack;
00387 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryTrack = ch;
00388 }
00389 else {
00390 delete (dynamic_cast<CandEvent *>
00391 (GetOwnedCandBase()))->fPrimaryTrack;
00392 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fPrimaryTrack = 0;
00393 }
00394 }
00395
00396
00397 void CandEventHandle::AddShower(const CandShowerHandle *shower)
00398 {
00399 const TObjArray &showerlist =
00400 (dynamic_cast<CandEvent*>(GetCandBase()))->fShowerList;
00401 Bool_t found(0);
00402 for (Int_t i=0; i<=showerlist.GetLast() && !found; i++) {
00403 CandShowerHandle *target =
00404 dynamic_cast<CandShowerHandle*>(showerlist.At(i));
00405 if (*shower == *target) found = 1;
00406 }
00407
00408 if (!found)
00409 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fShowerList.
00410 Add(shower->DupHandle());
00411 return;
00412 }
00413
00414
00415 void CandEventHandle::AddTrack(const CandTrackHandle *track)
00416 {
00417 const TObjArray &tracklist =
00418 (dynamic_cast<CandEvent*>(GetCandBase()))->fTrackList;
00419 Bool_t found(0);
00420 for (Int_t i=0; i<=tracklist.GetLast() && !found; i++) {
00421 CandTrackHandle *target =
00422 dynamic_cast<CandTrackHandle*>(tracklist.At(i));
00423 if (*track == *target) found = 1;
00424 }
00425
00426 if (!found)
00427 (dynamic_cast<CandEvent*>(GetOwnedCandBase()))->fTrackList.
00428 Add(track->DupHandle());
00429 return;
00430 }
00431
00432
00433 void CandEventHandle::CompressShower()
00434 {
00435 dynamic_cast<CandEvent*>(GetOwnedCandBase())->fShowerList.Compress();
00436 }
00437
00438
00439 void CandEventHandle::CompressTrack()
00440 {
00441 dynamic_cast<CandEvent*>(GetOwnedCandBase())->fTrackList.Compress();
00442 }
00443
00444 void CandEventHandle::SetContained(Bool_t contained)
00445 {
00446 dynamic_cast<CandEvent*>(GetOwnedCandBase())->fContained=contained;
00447 }
00448
00449 Bool_t CandEventHandle::IsContained()
00450 {
00451 return dynamic_cast<CandEvent*>(GetCandBase())->fContained;
00452 }
00453
00454
00455 void CandEventHandle::SetEnergy(Double_t energy)
00456 {
00457 dynamic_cast<CandEvent*>(GetOwnedCandBase())->fEnergy = energy;
00458 }
00459
00460 Double_t CandEventHandle::GetEnergy() const
00461 {
00462 return dynamic_cast<const CandEvent*>(GetCandBase())->fEnergy;
00463 }
00464
00465
00466 XXXITRIMP(CandEventHandle)