00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #include <cassert>
00013 #include <cmath>
00014
00015 #include "CandFitTrackMS/FitTrackMSListModule.h"
00016
00017 #include "Algorithm/AlgConfig.h"
00018 #include "Algorithm/AlgFactory.h"
00019 #include "Algorithm/AlgHandle.h"
00020 #include "CandData/CandHeader.h"
00021 #include "CandData/CandRecord.h"
00022 #include "CandFitTrackMS/CandFitTrackMSListHandle.h"
00023 #include "CandFitTrackMS/CandFitTrackMSList.h"
00024 #include "CandFitTrackMS/CandFitTrackMSHandle.h"
00025 #include "Candidate/CandContext.h"
00026 #include "Conventions/Munits.h"
00027 #include "JobControl/JobCModuleRegistry.h"
00028 #include "JobControl/JobCommand.h"
00029 #include "MessageService/MsgService.h"
00030 #include "MinosObjectMap/MomNavigator.h"
00031 #include "RawData/RawHeader.h"
00032 #include "RawData/RawRecord.h"
00033 #include "RecoBase/CandClusterListHandle.h"
00034 #include "RecoBase/CandSliceListHandle.h"
00035 #include "Validity/VldContext.h"
00036 #include "DatabaseInterface/DbiResultPtr.h"
00037 #include "Calibrator/CalMapperFits.h"
00038 #include "CandDigit/CandDigitListHandle.h"
00039 #include "RawData/RawDigit.h"
00040 #include "RawData/RawChannelId.h"
00041 #include "RawData/RawDaqSnarlHeader.h"
00042 #include "RawData/RawDaqHeaderBlock.h"
00043 #include "RawData/RawDigitDataBlock.h"
00044 #include "RawData/RawVarcErrorInTfBlock.h"
00045 #include "RecoBase/CandSliceHandle.h"
00046 #include "RecoBase/CandSliceListHandle.h"
00047 #include "RecoBase/CandStripHandle.h"
00048 #include "RecoBase/CandStripListHandle.h"
00049 #include "RecoBase/CandTrackHandle.h"
00050 #include "RecoBase/CandTrackListHandle.h"
00051 #include "RecoBase/LinearFit.h"
00052 #include "UgliGeometry/UgliGeomHandle.h"
00053 #include "UgliGeometry/UgliStripHandle.h"
00054
00055 #include "MINF_Classes/MINFast.h"
00056 #include "REROOT_Classes/REROOT_NeuKin.h"
00057 #include "REROOT_Classes/REROOT_NeuVtx.h"
00058
00059 ClassImp(FitTrackMSListModule)
00060
00061 CVSID("$Id: FitTrackMSListModule.cxx,v 1.11 2010/01/06 18:45:41 rhatcher Exp $");
00062
00063 JOBMODULE(FitTrackMSListModule,"FitTrackMSListModule",
00064 "Builds CandFitTrackMSList from CandTrackList");
00065
00066
00067 FitTrackMSListModule::FitTrackMSListModule() :
00068 fListIn("CandTrackList"),fListOut("CandFitTrackMSList"),fFile(0)
00069 {
00070 MSG("FitTrackMS", Msg::kVerbose) << "FitTrackMSListModule::Constructor\n";
00071
00072
00073 AlgFactory &af = AlgFactory::GetInstance();
00074
00075
00076 af.Register("AlgFitTrackMS", "default", "libCandFitTrackMS.so", "AlgConfig");
00077
00078
00079 af.Register("AlgFitTrackMSList", "default", "libCandFitTrackMS.so",
00080 "AlgConfig");
00081 }
00082
00083
00084 FitTrackMSListModule::~FitTrackMSListModule()
00085 {
00086 MSG("FitTrackMS", Msg::kVerbose) << "FitTrackMSListModule::Destructor\n";
00087 }
00088
00089 JobCResult FitTrackMSListModule::Reco(MomNavigator *mom)
00090 {
00091 JobCResult result(JobCResult::kPassed);
00092
00093 MSG("FitTrackMS", Msg::kVerbose) << "FitTrackMSListModule::Reco\n";
00094
00095
00096 CandRecord *candrec = dynamic_cast<CandRecord *>
00097 (mom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00098 if (candrec == 0) {
00099 MSG("FitTrackMS", Msg::kWarning) << "No PrimaryCandidateRecord in MOM."
00100 << endl;
00101 result.SetWarning().SetFailed();
00102 return result;
00103 }
00104
00105
00106 MSG("FitTrackMS", Msg::kVerbose)
00107 << "CandSliceListHandle *cslh = (CandSliceListHandle *) "
00108 << "candrec->FindCandHandle(\"CandSliceListHandle\", "
00109 << "fListIn.Data());" << endl;
00110
00111
00112
00113
00114
00115 CandSliceListHandle *cslh = dynamic_cast<CandSliceListHandle *>
00116 (candrec->FindCandHandle("CandSliceListHandle"));
00117 CandTrackListHandle *ctlh = dynamic_cast<CandTrackListHandle *>
00118 (candrec->FindCandHandle("CandTrackListHandle"));
00119
00120 TObjArray cxin;
00121 cxin.Add(cslh);
00122 cxin.Add(ctlh);
00123
00124
00125
00126 MSG("FitTrackMS", Msg::kDebug)
00127 << "Get Singleton instance of AlgFactory." << endl
00128 << "AlgFactory &af = AlgFactory::GetInstance();" << endl;
00129
00130
00131 AlgFactory &af = AlgFactory::GetInstance();
00132
00133
00134 MSG("FitTrackMS", Msg::kDebug)
00135 << "Ask AlgFactory for Singleton AlgFitTrackMSList instance." << endl
00136 << "AlgHandle adlh = af.GetAlgHandle(\"AlgFitTrackMSList\", \"default\");"
00137 << endl;
00138 AlgHandle adlh = af.GetAlgHandle("AlgFitTrackMSList", "default");
00139
00140 MSG("FitTrackMS", Msg::kDebug) << "CandContext cx(this);" << endl;
00141 CandContext cx(this, mom);
00142
00143 MSG("FitTrackMS", Msg::kDebug) << "cx.SetDataIn(cslh);" << endl;
00144 cx.SetDataIn(&cxin);
00145 cx.SetCandRecord(candrec);
00146
00147
00148 MSG("FitTrackMS", Msg::kDebug)
00149 << "ctllh = CandFitTrackMSList::MakeCandidate(adlh, cx);" << endl;
00150 CandFitTrackMSListHandle ctllh = CandFitTrackMSList::MakeCandidate(adlh, cx);
00151 ctllh.SetName(fListOut.Data());
00152 ctllh.SetTitle(TString("Created by FitTrackMSListModule from ").
00153 Append(ctlh->GetName()));
00154
00155
00156 MSG("FitTrackMS", Msg::kDebug) << "candrec->SecureCandHandle(ctllh);"
00157 << endl;
00158 candrec->SecureCandHandle(ctllh);
00159
00160 return result;
00161 }
00162
00163 const Registry &FitTrackMSListModule::DefaultConfig() const
00164 {
00165
00166
00167
00168 MSG("FitTrackMS",Msg::kDebug) <<
00169 "FitTrackMSListModule::DefaultConfig" << endl;
00170
00171 static Registry r;
00172
00173 std::string name = this->JobCModule::GetName();
00174 name += ".config.default";
00175 r.SetName(name.c_str());
00176 r.UnLockValues();
00177
00178
00179 r.Set("Nofit",0);
00180 r.Set("NoBField",0);
00181 r.Set("NoMS",0);
00182 r.Set("BothFit",1);
00183 r.Set("FullAna",0);
00184 r.Set("BFisFlipped",1);
00185
00186
00187 r.Set("PosErr",1.18*Munits::cm);
00188 r.Set("XZero",1.76*Munits::cm);
00189 r.Set("Dedx",1.454*Munits::GeV / Munits::m);
00190 r.Set("SuperModGapSize",1.593*Munits::m);
00191 r.Set("SuperModSkippedPlane",250);
00192
00193
00194 r.Set("MaxHits",400);
00195 r.Set("MinHits",5);
00196 r.Set("MaxP",100*Munits::GeV);
00197 r.Set("MinP",0.01*Munits::GeV);
00198 r.Set("MaxIter",30);
00199 r.Set("InShower",99);
00200 r.Set("LTolerance",.01);
00201 r.Set("PTolerance",.01);
00202
00203 r.LockValues();
00204
00205 return r;
00206 }
00207
00208
00209 void FitTrackMSListModule::Config(const Registry &r)
00210 {
00211
00212
00213 MSG("FitTrackMS", Msg::kDebug) << "FitTrackMSListModule::Config" <<
00214 endl;
00215
00216
00217 AlgFactory &af = AlgFactory::GetInstance();
00218 AlgHandle adf = af.GetAlgHandle("AlgFitTrackMS","default");
00219 AlgConfig &acdf = adf.GetAlgConfig();
00220
00221 acdf.UnLockValues();
00222 acdf.Merge(r);
00223 acdf.LockValues();
00224 }
00225
00226
00227 JobCResult FitTrackMSListModule::Ana(const MomNavigator *mom)
00228 {
00229
00230 JobCResult result(JobCResult::kPassed);
00231
00232
00233 MSG("FitTrackMS", Msg::kDebug) << "FitTrackMSListModule::Ana\n";
00234
00235 if (!fFile) {
00236 fFile = new TFile("fittrackms.root","RECREATE");
00237
00238 fStripNt = new TTree("stripnt","StripSR Tree");
00239 fStripNt->SetAutoSave(100000);
00240 fStripNt->Branch("run",&nt_run,"run/I");
00241 fStripNt->Branch("snarl",&nt_snarl,"snarl/I");
00242 fStripNt->Branch("timesec",&nt_timesec,"timesec/I");
00243 fStripNt->Branch("timens",&nt_timens,"timens/D");
00244 fStripNt->Branch("track",&nt_track,"track/I");
00245 fStripNt->Branch("plane",&nt_plane,"plane/i2");
00246 fStripNt->Branch("planeview",&nt_planeview,"planeview/I1");
00247 fStripNt->Branch("strip",&nt_strip,"strip/i1");
00248 fStripNt->Branch("tpos",&nt_tpos,"tpos/F");
00249 fStripNt->Branch("inshower",&nt_inshower,"inshower/i1");
00250 fStripNt->Branch("adc",&nt_adc,"adc[2]/I2");
00251 fStripNt->Branch("adcplane",&nt_adcplane,"adcplane/F");
00252 fStripNt->Branch("time",&nt_time,"time[2]/D");
00253 fStripNt->Branch("corrtime",&nt_corrtime,"corrtime[2]/D");
00254 fStripNt->Branch("residtime",&nt_residtime,"residtime[2]/D");
00255 fStripNt->Branch("crate",&nt_crate,"crate[2]/I1");
00256 fStripNt->Branch("varc",&nt_varc,"varc[2]/I1");
00257 fStripNt->Branch("vmm",&nt_vmm,"vmm[2]/I1");
00258 fStripNt->Branch("vaadc",&nt_vaadc,"vaadc[2]/I1");
00259 fStripNt->Branch("vachip",&nt_vachip,"vachip[2]/I1");
00260 fStripNt->Branch("vachannel",&nt_vachannel,"vachannel[2]/I1");
00261 fStripNt->Branch("pixel",&nt_pixel,"pixel[2]/I1");
00262 fStripNt->Branch("uvz",&nt_uvz,"uvz[3]/F");
00263 fStripNt->Branch("vtxuvz",&nttrack_uvz,"vtxuvz[3]/F");
00264 fStripNt->Branch("vtxdircos",&nttrack_dircos,"vtxdircos[3]/F");
00265 fStripNt->Branch("houghdircos",&nttrack_houghdircos,"houghdircos[3]/F");
00266 fStripNt->Branch("fitdircos",&nttrack_fitdircos,"fitdircos[3]/F");
00267 fStripNt->Branch("fitintercept",&nttrack_fitintercept,"fitintercept[2]/F");
00268 fStripNt->Branch("enduvz",&nttrack_uvzend,"enduvz[3]/F");
00269 fStripNt->Branch("enddircos",&nttrack_dircosend,"enddircos[3]/F");
00270 fStripNt->Branch("dircos",&nt_dircos,"dircos[3]/F");
00271 fStripNt->Branch("clearfiber",&nt_clearfiber,"clearfiber[2]/F");
00272 fStripNt->Branch("wlspigtail",&nt_wlspigtail,"wlspigtail[2]/F");
00273 fStripNt->Branch("halflength",&nt_halflength,"halflength/F");
00274 fStripNt->Branch("timeslope",&nttrack_timeslope,"timeslope/F");
00275 fStripNt->Branch("pmtph",&nt_pmtph,"pmtph[2]/F");
00276 fStripNt->Branch("houghchi2",&nttrack_houghchi2,"houghchi2/F");
00277 fStripNt->Branch("attndist",&nt_attndist,"attndist[2]/F");
00278 fStripNt->Branch("c1",&nt_attnc1,"c1[2]/F");
00279 fStripNt->Branch("c2",&nt_attnc2,"c2[2]/F");
00280 fStripNt->Branch("l1",&nt_attnl1,"l1[2]/F");
00281 fStripNt->Branch("l2",&nt_attnl2,"l2[2]/F");
00282 fStripNt->Branch("attnnorm",&nt_attnnorm,"attnnorm[2]/F");
00283 fStripNt->Branch("attncorr",&nt_attncorr,"attncorr[2]/F");
00284 fStripNt->Branch("ds",&nt_ds,"ds/F");
00285
00286 fPlaneNt = new TTree("planent","PlaneSR Tree");
00287 fPlaneNt->SetAutoSave(10000);
00288 fPlaneNt->Branch("run",&nt_run,"run/I");
00289 fPlaneNt->Branch("snarl",&nt_snarl,"snarl/I");
00290 fPlaneNt->Branch("timesec",&nt_timesec,"timesec/I");
00291 fPlaneNt->Branch("timens",&nt_timens,"timens/D");
00292 fPlaneNt->Branch("track",&nt_track,"track/I");
00293 fPlaneNt->Branch("nstrip",&ntplane_nstrip,"nstrip/I");
00294 fPlaneNt->Branch("adc",&ntplane_adc,"adc/I");
00295 fPlaneNt->Branch("plane",&ntplane_plane,"plane/i2");
00296 fPlaneNt->Branch("uvz",&ntplane_uvz,"uvz[3]/F");
00297 fPlaneNt->Branch("dircos",&ntplane_dircos,"dircos[3]/F");
00298
00299 fTrackNt = new TTree("tracknt","FitTrackMS Tree");
00300 fTrackNt->SetAutoSave(10000);
00301 fTrackNt->Branch("run",&nt_run,"run/I");
00302 fTrackNt->Branch("snarl",&nt_snarl,"snarl/I");
00303 fTrackNt->Branch("timesec",&nt_timesec,"timesec/I");
00304 fTrackNt->Branch("timens",&nt_timens,"timens/D");
00305 fTrackNt->Branch("track",&nt_track,"track/I");
00306 fTrackNt->Branch("nstrip",&nttrack_nstrip,"nstrip/I");
00307 fTrackNt->Branch("ntrackstrip",&nttrack_ntrackstrip,"ntrackstrip/I");
00308 fTrackNt->Branch("ndigit",&nttrack_ndigit,"ndigit/I");
00309 fTrackNt->Branch("ntrackdigit",&nttrack_ntrackdigit,"ntrackdigit/I");
00310 fTrackNt->Branch("ntimefitdigit",&nttrack_ntimefitdigit,"ntimefitdigit/I");
00311 fTrackNt->Branch("adc",&nttrack_adc,"adc/I");
00312 fTrackNt->Branch("nplane",&nttrack_nplane,"nplane/i2");
00313 fTrackNt->Branch("nplanetrack",&nttrack_nplane_track,"nplanetrack/i2");
00314 fTrackNt->Branch("uvz",&nttrack_uvz,"uvz[3]/F");
00315 fTrackNt->Branch("dircos",&nttrack_dircos,"dircos[3]/F");
00316 fTrackNt->Branch("houghdircos",&nttrack_houghdircos,"houghdircos[3]/F");
00317 fTrackNt->Branch("fitdircos",&nttrack_fitdircos,"fitdircos[3]/F");
00318 fTrackNt->Branch("uvzend",&nttrack_uvzend,"uvzend[3]/F");
00319 fTrackNt->Branch("dircosend",&nttrack_dircosend,"dircosend[3]/F");
00320 fTrackNt->Branch("timeslope",&nttrack_timeslope,"timeslope/F");
00321 fTrackNt->Branch("timefitchi2",&nttrack_timefitchi2,"timefitchi2/F");
00322 fTrackNt->Branch("houghchi2",&nttrack_houghchi2,"houghchi2/F");
00323 fTrackNt->Branch("year",&nttrack_date_year,"year/i3");
00324 fTrackNt->Branch("month",&nttrack_date_month,"month/i2");
00325 fTrackNt->Branch("day",&nttrack_date_day,"day/i2");
00326 fTrackNt->Branch("hour",&nttrack_date_hour,"hour/i2");
00327 fTrackNt->Branch("minute",&nttrack_date_minute,"minute/i2");
00328 fTrackNt->Branch("second",&nttrack_date_second,"second/i2");
00329 fTrackNt->Branch("nanosecond",&nttrack_date_nanosecond,"nanosecond/i");
00330 fTrackNt->Branch("snarl_nstrip",&nttrack_snarl_nstrip,"snarl_nstrip/i");
00331 fTrackNt->Branch("snarl_begplane",&nttrack_snarl_begplane,"snarl_begplane/i2");
00332 fTrackNt->Branch("snarl_endplane",&nttrack_snarl_endplane,"snarl_endplane/i2");
00333 fTrackNt->Branch("snarl_nplane",&nttrack_snarl_nplane,"snarl_nplane/i2");
00334 fTrackNt->Branch("snarl_adc",&nttrack_snarl_adc,"snarl_adc/F");
00335 fTrackNt->Branch("utime",&nttrack_utime,"utime[2]/F");
00336 fTrackNt->Branch("vtime",&nttrack_vtime,"vtime[2]/F");
00337 fTrackNt->Branch("nplanefaildemux",&nttrack_nplanefaildemux,"nplanefaildemux/i2");
00338 fTrackNt->Branch("begdigitstrip",&nttrack_begdigitstrip,"begdigitstrip[2]/F");
00339 fTrackNt->Branch("dplanebeg",&nttrack_dplanebeg,"dplanebeg/I");
00340 fTrackNt->Branch("dplaneend",&nttrack_dplaneend,"dplaneend/I");
00341
00342 fTrackNt->Branch("momentum",&nttrack_momentum,"momentum/F");
00343 fTrackNt->Branch("momentumL",&nttrack_momentumL,"momentumL/F");
00344 fTrackNt->Branch("momentumBF",&nttrack_momentumBF,"momentumBF/F");
00345 fTrackNt->Branch("momentumMS",&nttrack_momentumMS,"momentumMS/F");
00346 fTrackNt->Branch("momentumBoth",&nttrack_momentumBoth,"momentumBoth/F");
00347 fTrackNt->Branch("momentumAlt",&nttrack_momentumAlt,"momentumAlt/F");
00348 fTrackNt->Branch("chi2",&nttrack_chi2,"chi2/F");
00349 fTrackNt->Branch("chi2L",&nttrack_chi2L,"chi2L/F");
00350 fTrackNt->Branch("chi2BF",&nttrack_chi2BF,"chi2BF/F");
00351 fTrackNt->Branch("chi2MS",&nttrack_chi2MS,"chi2MS/F");
00352 fTrackNt->Branch("chi2Both",&nttrack_chi2Both,"chi2Both/F");
00353 fTrackNt->Branch("chi2Alt",&nttrack_chi2Alt,"chi2Alt/F");
00354
00355 fTrackNt->Branch("ds",&nttrack_ds,"ds/F");
00356 fTrackNt->Branch("maxradius",&nttrack_maxradius,"maxradius/F");
00357
00358 fTrackNt->Branch("charge",&nttrack_charge,"charge/F");
00359 fTrackNt->Branch("charged",&nttrack_charged,"charged/F");
00360 fTrackNt->Branch("flag",&nttrack_flag,"flag/I");
00361 fTrackNt->Branch("iter",&nttrack_iter,"iter/I");
00362
00363 if (gMINFast) {
00364 fTrackNt->Branch("inu",&ntreroot_inu,"inu/I1");
00365 fTrackNt->Branch("iaction",&ntreroot_iaction,"inu/I1");
00366 fTrackNt->Branch("p4nu",&ntreroot_p4nu,"p4nu[4]/F");
00367 fTrackNt->Branch("p4sh",&ntreroot_p4sh,"p4sh[4]/F");
00368 fTrackNt->Branch("p4mu",&ntreroot_p4mu,"p4mu[4]/F");
00369 fTrackNt->Branch("p4el",&ntreroot_p4el,"p4el[4]/F");
00370 fTrackNt->Branch("xyz",&ntreroot_xyz,"xyz[3]/F");
00371 }
00372
00373 }
00374
00375
00376 REROOT_Event *ev = 0;
00377 REROOT_NeuKin *rneukin = 0;
00378 REROOT_NeuVtx *rneuvtx = 0;
00379 if (gMINFast) {
00380 ev = gMINFast->GetREROOTEvent();
00381 rneukin = dynamic_cast<REROOT_NeuKin*>(ev->neukins()->First());
00382 rneuvtx = dynamic_cast<REROOT_NeuVtx*>(ev->neuvtxs()->First());
00383 }
00384
00385 ntreroot_inu = 0;
00386 ntreroot_iaction = 0;
00387 for (int i=0; i<4; i++) {
00388 ntreroot_p4nu[i] = 0.;
00389 ntreroot_p4sh[i] = 0.;
00390 ntreroot_p4mu[i] = 0.;
00391 ntreroot_p4el[i] = 0.;
00392 }
00393 for (int i=0; i<3; i++) {
00394 ntreroot_xyz[i] = 0.;
00395 }
00396
00397 if (rneuvtx && rneukin) {
00398 ntreroot_inu = rneukin->INu();
00399 ntreroot_iaction = rneukin->IAction();
00400 for (int i=0; i<4; i++) {
00401 ntreroot_p4nu[i] = rneukin->P4Neu()[i];
00402 ntreroot_p4sh[i] = rneukin->P4Shw()[i];
00403 ntreroot_p4mu[i] = rneukin->P4Mu1()[i];
00404 ntreroot_p4el[i] = rneukin->P4El1()[i];
00405 }
00406 ntreroot_xyz[0] = rneuvtx->X();
00407 ntreroot_xyz[1] = rneuvtx->Y();
00408 ntreroot_xyz[2] = rneuvtx->Z();
00409 }
00410
00411
00412
00413 Int_t vach2pixel[18] = {0,0,15,1,16,2,11,5,12,6,7,9,8,10,3,14,4,13};
00414
00415 CandRecord* candrec = dynamic_cast<CandRecord*>
00416 (mom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00417 if (candrec==0) {
00418 MSG("FitTrackMS", Msg::kWarning)
00419 << "No PrimaryCandidateRecord in MOM." << endl;
00420 result.SetWarning().SetFailed();
00421 return result;
00422 }
00423
00424 CandFitTrackListHandle *tracklist = dynamic_cast<CandFitTrackListHandle*>
00425 (candrec->FindCandHandle("CandFitTrackListHandle"));
00426 if (!tracklist) {
00427 MSG("FitTrackMS", Msg::kWarning)
00428 << "No CandFitTrackListHandle in CandRecord." << endl;
00429 return result;
00430 }
00431
00432 CandDigitListHandle *digitlist = dynamic_cast<CandDigitListHandle*>
00433 (candrec->FindCandHandle("CandDigitListHandle"));
00434
00435 CandSliceListHandle *slicelist = dynamic_cast<CandSliceListHandle*>
00436 (candrec->FindCandHandle("CandSliceListHandle"));
00437
00438 nttrack_snarl_nstrip = 0;
00439 nttrack_snarl_begplane = 0;
00440 nttrack_snarl_endplane = 0;
00441 nttrack_snarl_nplane = 0;
00442 nttrack_snarl_adc = 0.;
00443
00444 Int_t planedigit[1000];
00445 Int_t planestrip[1000];
00446 Float_t planecharge[1000];
00447 for (int i=0; i<1000; i++) {
00448 planedigit[i] = 0;
00449 planestrip[i] = 0;
00450 planecharge[i] = 0.;
00451 }
00452
00453 if (slicelist && slicelist->GetNDaughters()>0) {
00454 TIter sliceItr(slicelist->GetDaughterIterator());
00455 CandSliceHandle *slice = dynamic_cast<CandSliceHandle*>(sliceItr());
00456 nttrack_snarl_nstrip = slice->GetNStrip();
00457 nttrack_snarl_begplane = slice->GetBegPlane();
00458 nttrack_snarl_endplane = slice->GetEndPlane();
00459 nttrack_snarl_adc = slice->GetCharge();
00460 TIter stripItr(slice->GetDaughterIterator());
00461 while (CandStripHandle *strip = dynamic_cast<CandStripHandle*>(stripItr())) {
00462 Int_t iplane = strip->GetPlane();
00463 if (iplane>=0 && iplane<1000) {
00464 planestrip[iplane]++;
00465 planedigit[iplane] += strip->GetNDigit();
00466 planecharge[iplane] += strip->GetCharge();
00467 }
00468 }
00469 }
00470
00471 for (int i=0; i<1000; i++) {
00472 if (planecharge[i]>200.) {
00473 nttrack_snarl_nplane++;
00474 }
00475 }
00476
00477 nttrack_nplanefaildemux = 0;
00478 for (int i=0; i<1000; i++) {
00479 if (planestrip[i]>0 && (Float_t)(planedigit[i])/(Float_t)(planestrip[i])<1.2) {
00480 nttrack_nplanefaildemux++;
00481 }
00482 }
00483
00484
00485
00486 RawRecord *rr = dynamic_cast<RawRecord *>(mom->GetFragment("RawRecord",0,"DaqSnarl"));
00487 if (rr == 0) {
00488 MSG("FitTrackMS", Msg::kWarning) << "No RawRecord in MOM." << endl;
00489 return result;
00490 }
00491
00492 const RawDaqSnarlHeader* snarlHdr =
00493 dynamic_cast<const RawDaqSnarlHeader*>(rr->GetRawHeader());
00494 if (snarlHdr) {
00495 nt_run = snarlHdr->GetRun();
00496 nt_snarl = snarlHdr->GetSnarl();
00497 }
00498
00499
00500 const RawDigitDataBlock *rddb = dynamic_cast<const RawDigitDataBlock *>
00501 (rr->FindRawBlock("RawDigitDataBlock"));
00502 if (rddb == 0) {
00503 MSG("FitTrackMS", Msg::kWarning) << "No RawDigitDataBlock in RawRecord." << endl;
00504 return result;
00505
00506 }
00507
00508 TIter trackItr(tracklist->GetDaughterIterator());
00509
00510 nt_timesec = -1;
00511 nt_timens = -1.;
00512 if (digitlist) {
00513 nt_timens = digitlist->GetAbsTime();
00514 }
00515
00516 candrec->GetVldContext()->GetTimeStamp().GetTime(kTRUE, 0, &nttrack_date_hour, &nttrack_date_minute, &nttrack_date_second);
00517 candrec->GetVldContext()->GetTimeStamp().GetDate(kTRUE, 0, &nttrack_date_year, &nttrack_date_month, &nttrack_date_day);
00518
00519 nttrack_date_nanosecond = candrec->GetVldContext()->GetTimeStamp().GetNanoSec();
00520
00521 nttrack_nstrip = 0;
00522 nttrack_ndigit = 0;
00523 nttrack_nplane = 0;
00524 nttrack_nplane_track = 0;
00525 nttrack_adc = 0;
00526 nttrack_uvz[0] = 0.;
00527 nttrack_uvz[1] = 0.;
00528 nttrack_uvz[2] = 0.;
00529 nttrack_dircos[0] = 0.;
00530 nttrack_dircos[1] = 0.;
00531 nttrack_dircos[2] = 0.;
00532 nttrack_uvzend[0] = 0.;
00533 nttrack_uvzend[1] = 0.;
00534 nttrack_uvzend[2] = 0.;
00535 nttrack_dircosend[0] = 0.;
00536 nttrack_dircosend[1] = 0.;
00537 nttrack_dircosend[2] = 0.;
00538 nttrack_houghdircos[0] = 0.;
00539 nttrack_houghdircos[1] = 0.;
00540 nttrack_houghdircos[2] = 0.;
00541 nttrack_fitdircos[0] = 0.;
00542 nttrack_fitdircos[1] = 0.;
00543 nttrack_fitdircos[2] = 0.;
00544 nttrack_fitintercept[0] = 0.;
00545 nttrack_fitintercept[1] = 0.;
00546 nttrack_houghchi2 = 0.;
00547 nttrack_utime[0] = 0.;
00548 nttrack_utime[1] = 0.;
00549 nttrack_vtime[0] = 0.;
00550 nttrack_vtime[1] = 0.;
00551 nttrack_dplanebeg = 0;
00552 nttrack_dplaneend = 0;
00553 nttrack_momentum = 0.;
00554 nttrack_ds = 0.;
00555 nttrack_maxradius = 0.;
00556 nttrack_begdigitstrip[0] = 0.;
00557 nttrack_begdigitstrip[1] = 0.;
00558 nttrack_ntrackstrip = 0;
00559 nttrack_ntrackdigit = 0;
00560 nttrack_ntimefitdigit = 0;
00561 nttrack_dircosend[0] = 0.;
00562 nttrack_dircosend[1] = 0.;
00563 nttrack_dircosend[2] = 0.;
00564 nttrack_houghdircos[0] = 0.;
00565 nttrack_houghdircos[1] = 0.;
00566 nttrack_houghdircos[2] = 0.;
00567 nttrack_houghchi2 = 0.;
00568 nttrack_nplane_track = 0;
00569 nttrack_timefitchi2 = 0;
00570 nttrack_timeslope = 0.;
00571
00572 nttrack_momentumL = 0.;
00573 nttrack_momentumMS = 0.;
00574 nttrack_momentumBF = 0.;
00575 nttrack_momentumBoth = 0.;
00576 nttrack_momentumAlt = 0.;
00577 nttrack_chi2 = 0.;
00578 nttrack_chi2L = 0.;
00579 nttrack_chi2MS = 0.;
00580 nttrack_chi2BF = 0.;
00581 nttrack_chi2Both = 0.;
00582 nttrack_chi2Alt = 0.;
00583
00584 nttrack_flag = 0;
00585 nttrack_iter = 0;
00586 nttrack_charge = 0.;
00587 nttrack_charged = 0.;
00588
00589
00590 DbiResultPtr<CalMapperFits> fMapperFitsPtr;
00591 fMapperFitsPtr.NewQuery(*candrec->GetVldContext(),0);
00592
00593 Int_t itrack=0;
00594 while (CandFitTrackHandle *track = dynamic_cast<CandFitTrackHandle*>(trackItr())) {
00595 CandFitTrackMSHandle *fittrackms = 0;
00596 if (track->InheritsFrom("CandFitTrackMSHandle")) {
00597 fittrackms = dynamic_cast<CandFitTrackMSHandle*>(track);
00598 }
00599 itrack++;
00600 nt_track = itrack;
00601 nttrack_nstrip = track->GetNStrip();
00602 nttrack_ndigit = track->GetNDigit();
00603 nttrack_nplane = track->GetNPlane();
00604 nttrack_nplane_track = 0;
00605 nttrack_adc = 0;
00606 nttrack_uvz[0] = track->GetVtxU();
00607 nttrack_uvz[1] = track->GetVtxV();
00608 nttrack_uvz[2] = track->GetVtxZ();
00609 nttrack_dircos[0] = track->GetDirCosU();
00610 nttrack_dircos[1] = track->GetDirCosV();
00611 nttrack_dircos[2] = track->GetDirCosZ();
00612 Int_t endplane = track->GetEndPlane();
00613 nttrack_uvzend[0] = track->GetU(endplane);
00614 nttrack_uvzend[1] = track->GetV(endplane);
00615 nttrack_uvzend[2] = track->GetZ(endplane);
00616 nttrack_dircosend[0] = 0.;
00617 nttrack_dircosend[1] = 0.;
00618 nttrack_dircosend[2] = 0.;
00619 nttrack_houghdircos[0] = 0.;
00620 nttrack_houghdircos[1] = 0.;
00621 nttrack_houghdircos[2] = 0.;
00622 nttrack_fitdircos[0] = 0.;
00623 nttrack_fitdircos[1] = 0.;
00624 nttrack_fitdircos[2] = 0.;
00625 nttrack_fitintercept[0] = 0.;
00626 nttrack_fitintercept[1] = 0.;
00627 nttrack_houghchi2 = 999999.;
00628 nttrack_utime[0] = 0.;
00629 nttrack_utime[1] = 0.;
00630 nttrack_vtime[0] = 0.;
00631 nttrack_vtime[1] = 0.;
00632 nttrack_dplanebeg = track->GetBegPlane(PlaneView::kU)-track->GetBegPlane(PlaneView::kV);
00633 nttrack_dplaneend = track->GetEndPlane(PlaneView::kU)-track->GetEndPlane(PlaneView::kV);
00634 nttrack_momentum = track->GetMomentum();
00635 nttrack_ds = 0;
00636 nttrack_maxradius = 0.;
00637 Float_t totcharge[2][2] = {{0.,0.},{0.,0.}};
00638 nttrack_begdigitstrip[0] = (Float_t)(planedigit[track->GetBegPlane(PlaneView::kU)])/(Float_t)(planestrip[track->GetBegPlane(PlaneView::kU)]);
00639 nttrack_begdigitstrip[1] = (Float_t)(planedigit[track->GetBegPlane(PlaneView::kV)])/(Float_t)(planestrip[track->GetBegPlane(PlaneView::kV)]);
00640
00641 if (fittrackms) {
00642
00643 nttrack_momentumL = fittrackms->GetMomentumL();
00644 nttrack_momentumBF = fittrackms->GetMomentumBF();
00645 nttrack_momentumMS = fittrackms->GetMomentumMS();
00646 nttrack_momentumBoth = fittrackms->GetMomentumBoth();
00647 nttrack_momentumAlt = fittrackms->GetMomentumAlt();
00648
00649 nttrack_chi2 = fittrackms->GetChi2();
00650 nttrack_chi2L = fittrackms->GetChi2L();
00651 nttrack_chi2BF = fittrackms->GetChi2BF();
00652 nttrack_chi2MS = fittrackms->GetChi2MS();
00653 nttrack_chi2Both = fittrackms->GetChi2Both();
00654 nttrack_chi2Alt = fittrackms->GetChi2Alt();
00655
00656 nttrack_flag = fittrackms->GetFlag();
00657 nttrack_iter = fittrackms->GetIter();
00658 nttrack_charge = fittrackms->GetEMCharge();
00659 nttrack_charged = fittrackms->GetEMChargeD();
00660 }
00661 nttrack_timeslope = fabs(track->GetTimeSlope());
00662
00663 Double_t timeslope = fabs(track->GetTimeSlope());
00664 Double_t timeoffset = track->GetTimeOffset();
00665
00666 TIter stripItr(track->GetDaughterIterator());
00667
00668 Double_t uzfit[1000],ufit[1000],uwfit[1000],uph[1000];
00669 Double_t vzfit[1000],vfit[1000],vwfit[1000],vph[1000];
00670
00671 for (int i=0; i<1000; i++) {
00672 uzfit[i] = 0.;
00673 ufit[i] = 0.;
00674 uwfit[i] = 0.;
00675 uph[i] = 0.;
00676 vzfit[i] = 0.;
00677 vfit[i] = 0.;
00678 vwfit[i] = 0.;
00679 vph[i] = 0.;
00680 }
00681
00682 stripItr.Reset();
00683 while (CandStripHandle *strip = dynamic_cast<CandStripHandle*>(stripItr())) {
00684 nt_plane = strip->GetPlane();
00685 nt_tpos = strip->GetTPos();
00686 if (strip->GetPlaneView()==PlaneView::kU) {
00687 if (strip->GetNDigit(StripEnd::kNegative)>0) {
00688 totcharge[0][0] += strip->GetCharge(StripEnd::kNegative);
00689 nttrack_utime[0] += strip->GetCharge(StripEnd::kNegative)*track->GetT(nt_plane,StripEnd::kNegative);
00690 }
00691 if (strip->GetNDigit(StripEnd::kPositive)>0) {
00692 totcharge[0][1] += strip->GetCharge(StripEnd::kPositive);
00693 nttrack_utime[1] += strip->GetCharge(StripEnd::kPositive)*track->GetT(nt_plane,StripEnd::kPositive);
00694 }
00695 uzfit[nt_plane] = strip->GetZPos();
00696 ufit[nt_plane] += nt_tpos*strip->GetCharge();
00697 uph[nt_plane] += strip->GetCharge();
00698 uwfit[nt_plane] = 1.;
00699 } else if (strip->GetPlaneView()==PlaneView::kV) {
00700 if (strip->GetNDigit(StripEnd::kNegative)>0) {
00701 totcharge[1][0] += strip->GetCharge(StripEnd::kNegative);
00702 nttrack_vtime[0] += strip->GetCharge(StripEnd::kNegative)*track->GetT(nt_plane,StripEnd::kNegative);
00703 }
00704 if (strip->GetNDigit(StripEnd::kPositive)>0) {
00705 totcharge[1][1] += strip->GetCharge(StripEnd::kPositive);
00706 nttrack_vtime[1] += strip->GetCharge(StripEnd::kPositive)*track->GetT(nt_plane,StripEnd::kPositive);
00707 }
00708 vzfit[nt_plane] = strip->GetZPos();
00709 vfit[nt_plane] += nt_tpos*strip->GetCharge();
00710 vph[nt_plane] += strip->GetCharge();
00711 vwfit[nt_plane] = 1.;
00712 }
00713 }
00714
00715 for (int i=0; i<2; i++) {
00716 if (totcharge[0][i]>0.) {
00717 nttrack_utime[i] /= totcharge[0][i];
00718 }
00719 else {
00720 nttrack_utime[i] = -1.;
00721 }
00722 if (totcharge[1][i]>0.) {
00723 nttrack_vtime[i] /= totcharge[1][i];
00724 }
00725 else {
00726 nttrack_vtime[i] = -1.;
00727 }
00728 }
00729
00730 for (int i=0; i<1000; i++) {
00731 if (uph[i]>0.) {
00732 ufit[i] /= uph[i];
00733 }
00734 if (vph[i]>0.) {
00735 vfit[i] /= vph[i];
00736 }
00737 }
00738
00739 Double_t uparm[2],ueparm[2];
00740 Double_t vparm[2],veparm[2];
00741
00742 LinearFit::Weighted(1000,uzfit,ufit,uwfit,uparm,ueparm);
00743 LinearFit::Weighted(1000,vzfit,vfit,vwfit,vparm,veparm);
00744
00745 Double_t dudz = uparm[1];
00746 Double_t dvdz = vparm[1];
00747 nttrack_fitdircos[0] = dudz/sqrt(1.+dudz*dudz+dvdz*dvdz);
00748 nttrack_fitdircos[1] = dvdz/sqrt(1.+dudz*dudz+dvdz*dvdz);
00749 nttrack_fitdircos[2] = 1./sqrt(1.+dudz*dudz+dvdz*dvdz);
00750
00751 nttrack_fitintercept[0] = uparm[0];
00752 nttrack_fitintercept[1] = vparm[0];
00753
00754 if (track->GetTimeSlope()<0.) {
00755 nttrack_fitdircos[0] *= -1.;
00756 nttrack_fitdircos[1] *= -1.;
00757 nttrack_fitdircos[2] *= -1.;
00758 }
00759
00760 stripItr.Reset();
00761 while (CandStripHandle *strip = dynamic_cast<CandStripHandle*>(stripItr())) {
00762 for (int i=0; i<2; i++) {
00763 nt_adc[i] = -1;
00764 nt_time[i] = -1.;
00765 nt_corrtime[i] = -1.;
00766 nt_residtime[i] = -1.;
00767 nt_crate[i] = -1;
00768 nt_varc[i] = -1;
00769 nt_vmm[i] = -1;
00770 nt_vaadc[i] = -1;
00771 nt_vachip[i] = -1;
00772 nt_vachannel[i] = -1;
00773 nt_pixel[i] = -1;
00774 nt_pmtph[i] = 0.;
00775 }
00776 nt_plane = strip->GetPlane();
00777 nt_planeview = (Int_t)strip->GetPlaneView();
00778 nt_strip = strip->GetStrip();
00779 nt_tpos = strip->GetTPos();
00780 nt_inshower = track->IsInShower(strip);
00781 nt_uvz[0] = track->GetU(nt_plane);
00782 nt_uvz[1] = track->GetV(nt_plane);
00783 nt_uvz[2] = track->GetZ(nt_plane);
00784
00785
00786
00787
00788
00789 nt_adcplane = planecharge[nt_plane];
00790 nt_ds = 0;
00791 TIter digitItr(strip->GetDaughterIterator());
00792 PlexStripEndId *plexstripendid=0;
00793 UgliGeomHandle *ugh = 0;
00794 while (CandDigitHandle *digit = dynamic_cast<CandDigitHandle*>(digitItr())) {
00795 if (!plexstripendid) {
00796 plexstripendid = new PlexStripEndId(digit->GetPlexSEIdAltL().GetBestSEId());
00797 ugh = new UgliGeomHandle(*digit->GetVldContext());
00798 }
00799 const RawDigit *rd = rddb->At(digit->GetRawDigitIndex());
00800 if (rd) nttrack_adc += rd->GetADC();
00801 switch (digit->GetPlexSEIdAltL().GetBestSEId().GetEnd()) {
00802 case StripEnd::kNegative: case StripEnd::kWhole: case StripEnd::kUnknown:
00803 nt_time[0] = strip->GetBegTime(digit->GetPlexSEIdAltL().GetBestSEId().GetEnd());
00804 nt_corrtime[0] = track->GetT(strip->GetPlane(),StripEnd::kNegative);
00805 nt_residtime[0] = nt_corrtime[0]-(timeoffset+timeslope*nt_ds);
00806 if (rd) {
00807 RawChannelId rawid = rd->GetChannel();
00808 nt_timesec = rd->GetCrateT0().GetSec();
00809 nt_adc[0] = rd->GetADC();
00810 nt_crate[0] = rawid.GetCrate();
00811 nt_varc[0] = rawid.GetVarcId();
00812 nt_vmm[0] = rawid.GetVmm();
00813 nt_vaadc[0] = rawid.GetVaAdcSel();
00814 nt_vachip[0] = rawid.GetVaChip();
00815 nt_vachannel[0] = rawid.GetVaChannel();
00816 nt_pixel[0] = -1;
00817 if (nt_vachannel[0]>=2 && nt_vachannel[0]<=17) {
00818 nt_pixel[0] = vach2pixel[nt_vachannel[0]];
00819 }
00820 }
00821 break;
00822 case StripEnd::kPositive:
00823 nt_time[1] = strip->GetBegTime(digit->GetPlexSEIdAltL().GetBestSEId().GetEnd());
00824 nt_corrtime[1] = track->GetT(strip->GetPlane(),StripEnd::kPositive);
00825 nt_residtime[1] = nt_corrtime[1]-(timeoffset+timeslope*nt_ds);
00826 if (rd) {
00827 RawChannelId rawid = rd->GetChannel();
00828 nt_timesec = rd->GetCrateT0().GetSec();
00829 nt_adc[1] = rd->GetADC();
00830 nt_crate[1] = rawid.GetCrate();
00831 nt_varc[1] = rawid.GetVarcId();
00832 nt_vmm[1] = rawid.GetVmm();
00833 nt_vaadc[1] = rawid.GetVaAdcSel();
00834 nt_vachip[1] = rawid.GetVaChip();
00835 nt_vachannel[1] = rawid.GetVaChannel();
00836 nt_pixel[1] = -1;
00837 if (nt_vachannel[1]>=2 && nt_vachannel[1]<=17) {
00838 nt_pixel[1] = vach2pixel[nt_vachannel[1]];
00839 }
00840 }
00841 break;
00842 default:
00843 MSG("FitTrackMS",Msg::kError) << "undefined StripEnd " << digit->GetPlexSEIdAltL().GetBestSEId().GetEnd() << "\n";
00844 break;
00845 }
00846 }
00847 const CalMapperFits *mapcal[2];
00848 mapcal[0] = fMapperFitsPtr.GetRowByIndex(strip->GetStripEndId(StripEnd::kNegative).BuildPlnStripEndKey());
00849 mapcal[1] = fMapperFitsPtr.GetRowByIndex(strip->GetStripEndId(StripEnd::kPositive).BuildPlnStripEndKey());
00850 nt_attnc1[0] = 0.;
00851 nt_attnc2[0] = 0.;
00852 nt_attnl1[0] = 0.;
00853 nt_attnl2[0] = 0.;
00854 nt_attnnorm[0] = 0.;
00855 nt_attnc1[1] = 0.;
00856 nt_attnc2[1] = 0.;
00857 nt_attnl1[1] = 0.;
00858 nt_attnl2[1] = 0.;
00859 nt_attnnorm[1] = 0.;
00860 if (mapcal[0]) {
00861 nt_attnc1[0] = mapcal[0]->GetC1();
00862 nt_attnc2[0] = mapcal[0]->GetC2();
00863 nt_attnl1[0] = mapcal[0]->GetLambda1()/100.;
00864 nt_attnl2[0] = mapcal[0]->GetLambda2()/100.;
00865 nt_attnnorm[0] = mapcal[0]->GetNorm();
00866 }
00867 if (mapcal[1]) {
00868 nt_attnc1[1] = mapcal[1]->GetC1();
00869 nt_attnc2[1] = mapcal[1]->GetC2();
00870 nt_attnl1[1] = mapcal[1]->GetLambda1()/100.;
00871 nt_attnl2[1] = mapcal[1]->GetLambda2()/100.;
00872 nt_attnnorm[1] = mapcal[1]->GetNorm();
00873 }
00874 UgliStripHandle striphandle = ugh->GetStripHandle(*plexstripendid);
00875 nt_clearfiber[0] = striphandle.ClearFiber(StripEnd::kNegative);
00876 nt_clearfiber[1] = striphandle.ClearFiber(StripEnd::kPositive);
00877 nt_wlspigtail[0] = striphandle.WlsPigtail(StripEnd::kNegative);
00878 nt_wlspigtail[1] = striphandle.WlsPigtail(StripEnd::kPositive);
00879 nt_halflength = striphandle.GetHalfLength();
00880 nt_attndist[0] = 0.;
00881 nt_attndist[1] = 0.;
00882 if (strip->GetPlaneView()==PlaneView::kU) {
00883 nt_attndist[0] = nt_halflength+nt_wlspigtail[0]-nt_uvz[1];
00884 nt_attndist[1] = nt_halflength+nt_wlspigtail[1]+nt_uvz[1];
00885 }
00886 if (strip->GetPlaneView()==PlaneView::kV) {
00887 nt_attndist[0] = nt_halflength+nt_wlspigtail[0]+nt_uvz[0];
00888 nt_attndist[1] = nt_halflength+nt_wlspigtail[1]-nt_uvz[0];
00889 }
00890 for (int iside=0; iside<2; iside++) {
00891 nt_attncorr[iside] = nt_attnc1[iside]*exp(-nt_attndist[iside]/nt_attnl1[iside])+nt_attnc2[iside]*exp(-nt_attndist[iside]/nt_attnl2[iside]);
00892 }
00893 if (digitlist) {
00894 TIter alldigitItr(digitlist->GetDaughterIterator());
00895 while (CandDigitHandle *digit = dynamic_cast<CandDigitHandle*>(alldigitItr())) {
00896 const RawDigit *rd = rddb->At(digit->GetRawDigitIndex());
00897 if (rd) {
00898 for (int i=0; i<2; i++) {
00899 RawChannelId rawid = rd->GetChannel();
00900 if (rawid.GetCrate()==nt_crate[i] &&
00901 rawid.GetVarcId()==nt_varc[i] &&
00902 rawid.GetVmm()==nt_vmm[i] &&
00903 rawid.GetVaAdcSel()==nt_vaadc[i] &&
00904 rawid.GetVaChip()==nt_vachip[i]) {
00905 nt_pmtph[i] += digit->GetCharge();
00906 }
00907 }
00908 }
00909 }
00910 }
00911 delete plexstripendid;
00912 delete ugh;
00913 if (nt_uvz[0]*nt_uvz[0]+nt_uvz[1]*nt_uvz[1]>nttrack_maxradius*nttrack_maxradius) {
00914 nttrack_maxradius = sqrt(nt_uvz[0]*nt_uvz[0]+nt_uvz[1]*nt_uvz[1]);
00915 }
00916 fStripNt->Fill();
00917 }
00918
00919
00920
00921 fTrackNt->Fill();
00922
00923 for (Int_t iplane = track->GetBegPlane(); iplane<=track->GetEndPlane(); iplane++) {
00924 ntplane_nstrip = 0;
00925 ntplane_adc = 0;
00926 ntplane_plane = iplane;
00927 ntplane_uvz[0] = 0.;
00928 ntplane_uvz[1] = 0.;
00929 ntplane_uvz[2] = 0.;
00930 ntplane_dircos[0] = 0.;
00931 ntplane_dircos[1] = 0.;
00932 ntplane_dircos[2] = 0.;
00933 Float_t totalcharge=0.;
00934 stripItr.Reset();
00935 while (CandStripHandle *strip = dynamic_cast<CandStripHandle*>(stripItr())) {
00936 if (strip->GetPlane()==iplane) {
00937 ntplane_nstrip++;
00938 totalcharge += strip->GetCharge();
00939 ntplane_uvz[0] += strip->GetCharge()*track->GetU(iplane);
00940 ntplane_uvz[1] += strip->GetCharge()*track->GetV(iplane);
00941 ntplane_uvz[2] += strip->GetCharge()*track->GetZ(iplane);
00942
00943
00944
00945
00946
00947 TIter digitItr(strip->GetDaughterIterator());
00948 while (CandDigitHandle *digit = dynamic_cast<CandDigitHandle*>(digitItr())) {
00949 const RawDigit *rd = rddb->At(digit->GetRawDigitIndex());
00950 if (rd) ntplane_adc += rd->GetADC();
00951 }
00952 }
00953 }
00954 if (ntplane_nstrip>0) {
00955 for (int i=0; i<3; i++) {
00956 ntplane_uvz[i] /= totalcharge;
00957 ntplane_dircos[i] /= totalcharge;
00958 }
00959 fPlaneNt->Fill();
00960 }
00961 }
00962
00963 }
00964
00965 if (!itrack) {
00966 nt_track = -1;
00967 fTrackNt->Fill();
00968 }
00969
00970 fFile->Write("",TObject::kOverwrite);
00971
00972 return result;
00973 }
00974
00975 void FitTrackMSListModule::EndJob()
00976 {
00977 if (fFile) {
00978 fFile->Write("",TObject::kOverwrite);
00979 fFile->Close();
00980 }
00981 }