Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

AtNuTreeModule.cxx

Go to the documentation of this file.
00001 // AtNuTreeModule.cxx
00002 
00003 #include "AtNuTreeModule.h"
00004 #include "CandTrackAtNuHandle.h"
00005 #include "CandTrackAtNuListHandle.h"
00006 #include "CandShowerAtNuHandle.h"
00007 #include "CandShowerAtNuListHandle.h"
00008 #include "CandFitTrackAtNuHandle.h"
00009 #include "CandFitTrackAtNuListHandle.h"
00010 
00011 #include "MessageService/MsgService.h"  
00012 #include "JobControl/JobCModuleRegistry.h"
00013 #include "JobControl/JobCommand.h"
00014 #include "MinosObjectMap/MomNavigator.h"
00015 
00016 #include "RerootExodus/RerootExodus.h"
00017 #include "REROOT_Classes/REROOT_NeuKin.h"
00018 #include "REROOT_Classes/REROOT_FLSHit.h"
00019 #include "Record/SimSnarlRecord.h"
00020 #include "Record/SimSnarlHeader.h"
00021 #include "Digitization/DigiSignal.h"
00022 #include "Digitization/DigiScintHit.h"
00023 
00024 #include "RawData/RawRecord.h"
00025 #include "RawData/RawSnarlHeaderBlock.h"
00026 #include "RawData/RawDigit.h"
00027 #include "RawData/RawDigitDataBlock.h"
00028 #include "RawData/RawDaqSnarlHeader.h"
00029 
00030 #include "CandData/CandRecord.h"
00031 #include "CandData/CandHeader.h"
00032 #include "CandDigit/CandDeMuxDigitHandle.h"
00033 #include "CandDigit/CandDeMuxDigitListHandle.h"
00034 #include "RecoBase/CandStripHandle.h"
00035 #include "RecoBase/CandStripListHandle.h"
00036 #include "RecoBase/CandTrackHandle.h"
00037 #include "RecoBase/CandTrackListHandle.h"
00038 #include "RecoBase/CandShowerHandle.h"
00039 #include "RecoBase/CandShowerListHandle.h"
00040 #include "RecoBase/CandFitTrackHandle.h"
00041 #include "RecoBase/CandFitTrackListHandle.h"
00042 #include "RecoBase/Vertex.h"
00043 
00044 #include "UgliGeometry/UgliGeomHandle.h"
00045 #include "UgliGeometry/UgliPlnNode.h"
00046 #include "Validity/VldContext.h"
00047 #include "Plex/PlexStripEndId.h"
00048 #include "Plex/PlexPlaneId.h"
00049 #include "Plex/PlexSEIdAltL.h"
00050 #include "Plex/PlexSEIdAltLItem.h"
00051 
00052 #include "TDirectory.h"
00053 #include "TClonesArray.h"
00054 #include "TObjArray.h"
00055 #include "TParticle.h"
00056 
00057 CVSID("$Id: AtNuTreeModule.cxx,v 1.7 2006/05/22 16:44:42 rhatcher Exp $");
00058 
00059 JOBMODULE(AtNuTreeModule,"AtNuTreeModule","Testing CandTracks and CandShowers");
00060 
00061 AtNuTreeModule::AtNuTreeModule() : 
00062   fAtNuFile(0),
00063   fAtNuTree(0),
00064   fAtNuFileName("atnutree") 
00065 {
00066    
00067 }
00068 
00069 AtNuTreeModule::~AtNuTreeModule()
00070 {
00071 
00072 }
00073 
00074 void AtNuTreeModule::BeginJob()
00075 {
00076   Int_t k;
00077 
00078   Int_t tmpStrpExtr[8]={ 0, 28, 56, 76, 96, 116, 136, 164 };
00079   Int_t tmpStrpCell[28]={ 0, 1, 2, 3, 4, 5, 6, 
00080                           7, 8, 9, 10, 11, 12, 13, 
00081                           14, 15, 16, 17, 18, 19, 20, 
00082                           21, 22, 23, 24, 25, 26, 27 };
00083 
00084   for(k=0;k<8;k++){
00085     StrpExtr[k]=tmpStrpExtr[k];
00086   }
00087 
00088   for(k=0;k<28;k++){
00089     StrpCell[k]=tmpStrpCell[k];
00090   } 
00091 }
00092 
00093 JobCResult AtNuTreeModule::Ana(const MomNavigator* mom)
00094 {
00095 
00096   MSG("AtNuTreeModule",Msg::kInfo) << " *** AtNuTreeModule::Ana() *** " << endl;
00097   JobCResult result(JobCResult::kPassed);
00098   Int_t i,j,k;
00099 
00100   /*******************************
00101    * I N I T I A L I Z A T I O N *
00102    *******************************/
00103 
00104   run = -1; 
00105   subrun = -1;
00106   snarl = -1; 
00107   runtype = -1; 
00108   trigsrc = -1;
00109   date = -1;
00110   time = -1;
00111   timeframe = -1; 
00112   trigtimeraw = -999.9;
00113   trigtimecorr = -999.9;
00114 
00115   Ndigits = 0;
00116   Nstrps = 0;
00117   Ustrps = 0;
00118   Vstrps = 0;
00119   Nplns = 0; 
00120   Uplns = 0;
00121   Vplns = 0;
00122   begpln = -1;
00123   endpln = -1; 
00124   Nmuplns = 0;
00125 
00126   totPH = 0.0;
00127 
00128   IDnu = 0; 
00129   IDact = 0; 
00130   IDboson = 0;
00131   IDres = 0; 
00132   IDtarget = 0;
00133   x = -1.0; 
00134   y = -1.0; 
00135   Q2 = -1.0;
00136   W2 = -1.0; 
00137   Xsection = -1.0; 
00138   EMfrac = -1.0; 
00139   PnuX = 0.0; 
00140   PnuY = 0.0; 
00141   PnuZ = 0.0; 
00142   Enu = 0.0; 
00143   PmuX = 0.0; 
00144   PmuY = 0.0; 
00145   PmuZ = 0.0; 
00146   Emu = 0.0; 
00147   PelX = 0.0;
00148   PelY = 0.0;
00149   PelZ = 0.0; 
00150   Eel = 0.0;
00151   PhadX = 0.0; 
00152   PhadY = 0.0; 
00153   PhadZ = 0.0; 
00154   Ehad = 0.0; 
00155   PtargX = 0.0;
00156   PtargY = 0.0;
00157   PtargZ = 0.0;
00158   Etarg = 0.0;
00159   vtxX = 0.0; 
00160   vtxY = 0.0;
00161   vtxZ = 0.0; 
00162   muvtxX = 0.0; 
00163   muvtxY = 0.0;
00164   muvtxZ = 0.0; 
00165   muvtxR = 0.0;
00166   muvtxpln=-1;
00167   muendvtxX = 0.0;
00168   muendvtxY = 0.0;
00169   muendvtxZ = 0.0;
00170   muendvtxR = 0.0;
00171   muendvtxpln=-1;
00172   mupbeg = 0.0;
00173   mupend = 0.0;
00174   
00175   Ntrks = 0;
00176   TRKlast = 0;
00177   TRKcputime = 0.0;
00178   for(j=0;j<3;j++){ 
00179     TRKplns[j] = 0; 
00180     TRKstrps[j] = 0; 
00181     TRKdigits[j] = 0;
00182     TRKvtxpln[j] = -1;
00183     TRKbegpln[j] = -1; 
00184     TRKendpln[j] = -1; 
00185     TRKtrkplns[j] = 0; 
00186     TRKtrkPH[j] = 0.0; 
00187     TRKshwPH[j] = 0.0;
00188     TRKassocPH[j] = 0.0; 
00189     TRKassocPHfrac[j] = 0.0;
00190     TRKpbegX[j] = 0.0; 
00191     TRKpbegY[j] = 0.0; 
00192     TRKpbegZ[j] = 0.0; 
00193     TRKpendX[j] = 0.0; 
00194     TRKpendY[j] = 0.0; 
00195     TRKpendZ[j] = 0.0; 
00196     TRKplinX[j] = 0.0; 
00197     TRKplinY[j] = 0.0; 
00198     TRKplinZ[j] = 0.0; 
00199     TRKbegvtxX[j] = 0.0; 
00200     TRKbegvtxY[j] = 0.0; 
00201     TRKbegvtxZ[j] = 0.0;
00202     TRKbegvtxR[j] = -999.9;
00203     TRKbegvtxRdigits[j] = -999.9;
00204     TRKbegplndigits[j] = -1;
00205     TRKbegtrace[j] = -999.9; 
00206     TRKbegtraceZ[j] = 0.0; 
00207     TRKbegvtxUwidth[j] = 0.0;
00208     TRKbegvtxUmean[j] = 0.0;
00209     TRKbegvtxVwidth[j] = 0.0;
00210     TRKbegvtxVmean[j] = 0.0;
00211     TRKbegvtxRmax[j] = 0.0;
00212     TRKbegvtxQmax[j] = 0.0;
00213     TRKendvtxX[j] = 0.0; 
00214     TRKendvtxY[j] = 0.0; 
00215     TRKendvtxZ[j] = 0.0; 
00216     TRKendvtxR[j] = -999.9;
00217     TRKendvtxRdigits[j] = -999.9;
00218     TRKendplndigits[j] = -1;
00219     TRKendtrace[j] = -999.9;
00220     TRKendtraceZ[j] = -999.9;
00221     TRKendvtxUwidth[j] = 0.0;
00222     TRKendvtxUmean[j] = 0.0;
00223     TRKendvtxVwidth[j] = 0.0;
00224     TRKendvtxVmean[j] = 0.0;
00225     TRKendvtxRmax[j] = 0.0;
00226     TRKendvtxQmax[j] = 0.0; 
00227     TRKdir[j] = 0.0;
00228     TRKdirTrue[j] = 0.0;
00229     TRKdirTimeSlope[j] = 0.0;
00230     TRKdirTimeScatter[j] = 0.0;
00231     TRKbegTimeFitRms[j] = -1.0;
00232     TRKbegTimeFitNdf[j] = 0;
00233     TRKendTimeFitRms[j] = -1.0;
00234     TRKendTimeFitNdf[j] = 0;
00235     TRKbegvtxshw[j] = 0;
00236     TRKbegvtxshwstrips[j] = 0;
00237     TRKbegvtxshwreseeded[j] = -1;
00238     TRKendvtxshw[j] = 0;
00239     TRKendvtxshwstrips[j] = 0;
00240     TRKendvtxshwreseeded[j] = -1;
00241     TRKrange[j] = 0.0; 
00242     TRKrangeSteel[j]=0.0;
00243     TRKmomentumRange[j] = 0.0;
00244     TRKscore[j] = -1.0;
00245     TRKscoreMuEff[j] = -1.0;
00246     TRKscoreMuPur[j] = -1.0;
00247     TRKscorePiEff[j] = -1.0;
00248     TRKscorePiPur[j] = -1.0;
00249     TRKreseeded[j] = 0;
00250   }
00251 
00252   Nfits = 0;
00253   FITlast = 0;
00254   for(j=0;j<3;j++){
00255     FITcputime[j] = 0.0;
00256     FITvtxpln[j] = -1; 
00257     FITbegpln[j] = -1;
00258     FITendpln[j] = -1; 
00259     FITcharge[j] = 0.0; 
00260     FITchisqlin[j] = -1.0; 
00261     FITchisq[j] = -1.0; 
00262     FITQPmean[j] = 0.0;
00263     FITQPerr[j] = 0.0;
00264     FITQPcorr[j] = 0.0;
00265     FITQPwidth[j] = 0.0;
00266     FITQPplns[j] = 0;
00267     FITmomentumCurve[j] = 0.0; 
00268     FITmomentumCurveErr[j] = 0.0; 
00269     FITpass[j] = 0;
00270   }
00271 
00272   Nshws = 0;
00273   SHWlast = 0; 
00274   SHWcputime = 0.0;
00275   for(j=0;j<3;j++){
00276     SHWplns[j] = 0; 
00277     SHWstrps[j] = 0; 
00278     SHWdigits[j] = 0;
00279     SHWvtxpln[j] = -1;
00280     SHWbegpln[j] = -1; 
00281     SHWendpln[j] = -1; 
00282     SHWtotPH[j] = 0.0; 
00283     SHWpshwX[j] = 0.0; 
00284     SHWpshwY[j] = 0.0; 
00285     SHWpshwZ[j] = 0.0; 
00286     SHWwidthU[j] = 0.0;
00287     SHWwidthV[j] = 0.0;
00288     SHWvtxX[j] = 0.0; 
00289     SHWvtxY[j] = 0.0; 
00290     SHWvtxZ[j] = 0.0; 
00291     SHWdir[j] = 0.0;  
00292     SHWdirTrue[j] = 0.0;
00293     SHWvtxshw[j] = -1;
00294     SHWdirTrk[j] = 0.0; 
00295     SHWenergyPH[j] = 0.0; 
00296     SHWenergyNstrps[j] = 0.0; 
00297     SHWreseeded[j] = 0;
00298   }
00299 
00300  
00301   /*********************************
00302    * S I M S N A R L   R E C O R D *
00303    *********************************/
00304 
00305   MSG("AtNuTreeModule",Msg::kDebug) << " *** SIMSNARL RECORD *** " << endl;
00306 
00307   SimSnarlRecord* simrec = dynamic_cast<SimSnarlRecord *>(mom->GetFragment("SimSnarlRecord"));
00308   if(simrec){
00309 
00310     VldContext *vldc = (VldContext*)(simrec->GetVldContext());
00311     UgliGeomHandle ugh(*vldc);
00312 
00313     if(run<0) run=RerootExodus::GetRunNo();
00314     if(snarl<0) snarl=RerootExodus::GetEventNo();
00315 
00316     const SimSnarlHeader* hdr = dynamic_cast<const SimSnarlHeader*>(simrec->GetSimSnarlHeader());
00317     if(hdr){
00318       if(run<0) run = hdr->GetRun();
00319       if(subrun<0) subrun = hdr->GetSubRun();
00320       if(snarl<0) snarl = hdr->GetSnarl();
00321       if(runtype<0) runtype = hdr->GetRunType();
00322     }
00323 
00324     TObjArray arr(simrec->GetComponents());
00325     TIter iter(arr.MakeIterator());
00326     while(TObject* tob = (TObject*)(iter())){
00327       MSG("AtNuTreeModule",Msg::kDebug) << tob->GetName() << endl;
00328 
00329       if(tob->GetName()==TString("REROOT_NeuKin")){
00330         REROOT_NeuKin* nukin = dynamic_cast<REROOT_NeuKin*>(tob);
00331         MSG("AtNuTreeModule",Msg::kDebug) << " ... found REROOT_NeuKin " << endl;
00332         IDnu = nukin->INu();
00333         IDact = nukin->IAction();
00334         IDtarget = nukin->ITg();
00335         IDboson = nukin->IBoson();
00336         IDres = nukin->IResonance();
00337         Xsection = nukin->Sigma();
00338         EMfrac = nukin->EMFrac();
00339         W2 = nukin->W2();
00340         Q2 = nukin->Q2();
00341         x = nukin->X();
00342         y = nukin->Y();
00343         PnuX = nukin->P4Neu()[0];
00344         PnuY = nukin->P4Neu()[1];
00345         PnuZ = nukin->P4Neu()[2];
00346         Enu = nukin->P4Neu()[3];
00347         PmuX = nukin->P4Mu1()[0];
00348         PmuY = nukin->P4Mu1()[1];
00349         PmuZ = nukin->P4Mu1()[2];
00350         Emu = nukin->P4Mu1()[3];
00351         PelX = nukin->P4El1()[0];
00352         PelY = nukin->P4El1()[1];
00353         PelZ = nukin->P4El1()[2];
00354         Eel = nukin->P4El1()[3];
00355         PhadX = nukin->P4Shw()[0];
00356         PhadY = nukin->P4Shw()[1];
00357         PhadZ = nukin->P4Shw()[2];
00358         Ehad = nukin->P4Shw()[3];
00359         PtargX = nukin->P4Tgt()[0];
00360         PtargY = nukin->P4Tgt()[1];
00361         PtargZ = nukin->P4Tgt()[2];
00362         Etarg = nukin->P4Tgt()[3];
00363       }
00364 
00365       if(tob->GetName()==TString("StdHep")){
00366         TClonesArray* tpart = (TClonesArray*)(tob);
00367         MSG("AtNuTreeModule",Msg::kDebug) << " found StdHep " << endl;        
00368         TParticle* apart = dynamic_cast<TParticle*>(tpart->At(0));
00369         vtxX=apart->Vx(); vtxY=apart->Vy(); vtxZ=apart->Vz();
00370       }
00371     }
00372 
00373     MSG("AtNuTreeModule",Msg::kDebug) << " *** FLSHIT LIST *** " << endl;
00374     Int_t packedPEC,trueplane,trueext,truecell,truestrip,trueview=0,ipdg,itrack;
00375     Int_t itrkneg=-999,itrkpos=999;
00376     const TClonesArray* FLShits = (TClonesArray*)(RerootExodus::GetFLSHitList());
00377     for(i=0;i<1+FLShits->GetLast();i++){
00378       REROOT_FLSHit* FLS_hit = (REROOT_FLSHit*)FLShits->At(i);
00379       packedPEC=FLS_hit->IPackedPEC();
00380       trueplane=(Int_t)(packedPEC/65536.0);
00381       fMCStrpList[trueplane].Add(FLS_hit);
00382       if(FLS_hit->ITrack()>0 && FLS_hit->ITrack()<itrkpos) itrkpos=FLS_hit->ITrack();
00383       if(FLS_hit->ITrack()<0 && FLS_hit->ITrack()>itrkneg) itrkneg=FLS_hit->ITrack();
00384     }
00385 
00386     Double_t ptot,eloss;
00387     Double_t tpos=0., opos=0., xpos=0., ypos=0., upos=0., vpos=0., zpos,rpos;
00388     Double_t um,up,vm,vp,xm,xp,ym,yp;
00389     Double_t minmuvtxX=0.,minmuvtxY=0.,minmuvtxZ=0.,minmuvtxR=0.,minptot=-1.0;
00390     Double_t maxmuvtxX=0.,maxmuvtxY=0.,maxmuvtxZ=0.,maxmuvtxR=0.,maxptot=-1.0;
00391     Int_t minmuvtxpln=0,maxmuvtxpln=0;
00392     for(i=0;i<500;i++){
00393       for(j=0;j<1+fMCStrpList[i].GetLast();j++){
00394         REROOT_FLSHit* FLS_hit = (REROOT_FLSHit*)(fMCStrpList[i].At(j));        
00395         ipdg = FLS_hit->IPDG();
00396         itrack = FLS_hit->ITrack();
00397         ptot = FLS_hit->Ptot(); 
00398         eloss = FLS_hit->ELoss();
00399         if(ptot<0) ptot=-ptot;
00400         
00401         packedPEC=FLS_hit->IPackedPEC();
00402         trueplane=(Int_t)(packedPEC/65536.0);
00403         trueext=(Int_t)((packedPEC-trueplane*65536)/256.0);
00404         truecell=packedPEC-trueplane*65536-trueext*256;
00405         truestrip=StrpExtr[trueext-1]+StrpCell[truecell-1];
00406         
00407         PlexPlaneId trueplnid(vldc->GetDetector(),trueplane,0);
00408         UgliScintPlnHandle trueplnhandle = ugh.GetScintPlnHandle(trueplnid);
00409         if(trueplnhandle.GetPlaneView()==PlaneView::kU) trueview = 0;
00410         if(trueplnhandle.GetPlaneView()==PlaneView::kV) trueview = 1;  
00411         PlexStripEndId truestrpid(trueplnid,truestrip);
00412         UgliStripHandle truestrphandle = ugh.GetStripHandle(truestrpid);
00413         opos=0.005*(FLS_hit->XBegin()+FLS_hit->XEnd());
00414         tpos=truestrphandle.GetTPos();
00415         if(trueview==0){ upos=tpos; vpos=-opos; }
00416         if(trueview==1){ vpos=tpos; upos=opos; }
00417         xpos=0.7071*(upos-vpos); ypos=0.7071*(upos+vpos);
00418         zpos=trueplnhandle.GetZ0(); 
00419 
00420         rpos=4.0; 
00421         up=4.0-upos; if(up<rpos) rpos=up;
00422         um=4.0+upos; if(um<rpos) rpos=um;
00423         vp=4.0-vpos; if(vp<rpos) rpos=vp;
00424         vm=4.0+vpos; if(vm<rpos) rpos=vm;
00425         xp=4.0-xpos; if(xp<rpos) rpos=xp;
00426         xm=4.0+xpos; if(xm<rpos) rpos=xm;
00427         yp=4.0-ypos; if(yp<rpos) rpos=yp;
00428         ym=4.0+ypos; if(ym<rpos) rpos=ym;
00429 
00430         if( (IDnu==0&&(ipdg==13||ipdg==-13))
00431          || (IDnu==14&&ipdg==13)
00432          || (IDnu==-14&&ipdg==-13) ){
00433           if(minptot<0||ptot<minptot){
00434             minmuvtxX=xpos; minmuvtxY=ypos; minmuvtxZ=zpos; 
00435             minmuvtxR=rpos; minmuvtxpln=trueplane; minptot=ptot;
00436           }
00437           if(maxptot<0||ptot>maxptot){
00438             maxmuvtxX=xpos; maxmuvtxY=ypos; maxmuvtxZ=zpos;
00439             maxmuvtxR=rpos; maxmuvtxpln=trueplane; maxptot=ptot;
00440           }
00441         }
00442 
00443       }
00444     }
00445 
00446     if(minptot>=0.0 && maxptot>=0.0){
00447       muvtxX = maxmuvtxX; 
00448       muvtxY = maxmuvtxY;
00449       muvtxZ = maxmuvtxZ; 
00450       muvtxR = maxmuvtxR;
00451       muvtxpln = maxmuvtxpln;
00452       muendvtxX = minmuvtxX;
00453       muendvtxY = minmuvtxY;
00454       muendvtxZ = minmuvtxZ;
00455       muendvtxR = minmuvtxR;
00456       muendvtxpln = minmuvtxpln;
00457       mupbeg = maxptot;
00458       mupend = minptot;
00459     }
00460   }
00461 
00462   MSG("AtNuTreeModule",Msg::kDebug) << " *** END OF SIMRECORD *** " << endl;
00463 
00464 
00465   /***********************
00466    * R A W   R E C O R D * 
00467    ***********************/
00468 
00469   MSG("AtNuTreeModule",Msg::kDebug) << " *** RAW RECORD *** " << endl;
00470 
00471   RawRecord *rawrec = dynamic_cast<RawRecord *>(mom->GetFragment("RawRecord"));
00472   if(rawrec){
00473 
00474     Double_t timestamp;
00475     const RawDaqSnarlHeader* hdr = dynamic_cast<const RawDaqSnarlHeader*>(rawrec->GetRawHeader());
00476     if(hdr){
00477       if(run<0) run = hdr->GetRun(); 
00478       if(subrun<0) subrun = hdr->GetSubRun();
00479       if(snarl<0) snarl = hdr->GetSnarl();
00480       if(runtype<0) runtype = hdr->GetRunType();
00481       if(trigsrc<0) trigsrc = hdr->GetTrigSrc();
00482       if(timeframe<0) timeframe = hdr->GetTimeFrameNum();
00483     }
00484 
00485     TIter rdbit(rawrec->GetRawBlockIter());
00486     while(TObject* tob = (TObject*)(rdbit())){
00487       MSG("AtNuTreeModule",Msg::kDebug) << tob->GetName() << endl;
00488 
00489       if(tob->InheritsFrom("RawSnarlHeaderBlock")){
00490         MSG("AtNuTreeModule",Msg::kDebug) << "  ... found RawSnarlHeaderBlock " << endl;
00491         RawSnarlHeaderBlock* rdb = (RawSnarlHeaderBlock*)(tob);
00492         if(run<0) run = rdb->GetRun();
00493         if(subrun<0) subrun = rdb->GetSubRun(); 
00494         if(snarl<0) snarl = rdb->GetSnarl();
00495         if(runtype<0) runtype = rdb->GetRunType();
00496         if(trigsrc<0) trigsrc = rdb->GetTriggerSource();
00497         if(timeframe<0) timeframe = rdb->GetTimeFrameNum(); 
00498         timestamp = ((VldTimeStamp)(rdb->GetTriggerTime())).GetNanoSec();
00499         date = (((VldTimeStamp)(rdb->GetTriggerTime())).GetSec()-1059696000)/(3600*24);
00500         time = (((VldTimeStamp)(rdb->GetTriggerTime())).GetSec()-1059696000)%(3600*24);
00501         if(trigtimeraw<0.0) trigtimeraw=0.001*timestamp;
00502       }
00503     }
00504   }
00505 
00506   MSG("AtNuTreeModule",Msg::kDebug) << " *** END OF RAWRECORD *** " << endl;
00507  
00508 
00509   /***********************************
00510    * C A N D I D A T E   R E C O R D * 
00511    ***********************************/
00512 
00513   MSG("AtNuTreeModule",Msg::kDebug) << " *** CANDRECORD *** " << endl;
00514 
00515   CandRecord* candrec = dynamic_cast<CandRecord*>(mom->GetFragment("CandRecord","PrimaryCandidateRecord"));
00516   if(candrec){
00517 
00518     const CandHeader* hdr = candrec->GetCandHeader();
00519     if(hdr){
00520       if(run<0) run = hdr->GetRun();
00521       if(snarl<0) snarl = hdr->GetSnarl();
00522     }
00523 
00524     VldContext *vldc = (VldContext*)(candrec->GetVldContext());
00525     UgliGeomHandle ugh(*vldc);
00526 
00527     Int_t SHW=0,TRK=0,FIT=0;
00528     TIter candbit(candrec->GetCandHandleIter());
00529     while(TObject* tob = (TObject*)(candbit())){
00530       MSG("AtNuTreeModule",Msg::kDebug) << tob->GetName() << endl;
00531 
00532       // DIGITS
00533       if(tob->InheritsFrom("CandDeMuxDigitListHandle")){
00534         CandDeMuxDigitListHandle* digitlist = (CandDeMuxDigitListHandle*)(tob);
00535         MSG("AtNuTreeModule",Msg::kDebug) << " ... found CandDeMuxDigitListHandle " << endl;
00536 
00537         Int_t pln,xtalk;
00538         if(trigtimecorr<0.0) trigtimecorr=1.0e6*digitlist->GetAbsTime();
00539         TIter digitr(digitlist->GetDaughterIterator());
00540         while(CandDeMuxDigitHandle* digit = (CandDeMuxDigitHandle*)(digitr())){
00541           xtalk=0;
00542           if( (digit->GetDeMuxDigitFlagWord()<8)
00543            && (digit->GetDeMuxDigitFlagWord() & CandDeMuxDigit::kXTalk)==(CandDeMuxDigit::kXTalk) ){
00544             xtalk=1;
00545           }
00546           pln=digit->GetPlexSEIdAltL().GetBestSEId().GetPlane();
00547           if( pln>0 && pln<500 ){
00548             totPH+=digit->GetCharge(CalDigitType::kPE);
00549           }
00550         }
00551       }
00552 
00553       // STRIPS
00554       if(tob->InheritsFrom("CandStripListHandle")){
00555         CandStripListHandle* strplist = (CandStripListHandle*)(tob);
00556         MSG("AtNuTreeModule",Msg::kDebug) << " ... found CandStripListHandle " << endl;
00557 
00558         Int_t pln,vuw;
00559         TIter stritr(strplist->GetDaughterIterator());        
00560         while(CandStripHandle* strip = dynamic_cast<CandStripHandle*>(stritr())){
00561           if(strip){
00562             pln=strip->GetPlane();
00563             if( pln>0 && pln<500 && strip->GetCharge()>2.0){ 
00564               if(begpln<0||pln<begpln) begpln=pln; 
00565               if(endpln<0||pln>endpln) endpln=pln;            
00566               fTotStrpList[pln].Add(strip);
00567             }
00568           }
00569         }
00570         for(i=0;i<500;i++){
00571           if(1+fTotStrpList[i].GetLast()>0){
00572             vuw=-1;
00573             for(j=0;j<1+fTotStrpList[i].GetLast();j++){
00574                CandStripHandle* strip = (CandStripHandle*)(fTotStrpList[i].At(j)); 
00575 
00576               if(strip->GetPlaneView()==PlaneView::kU){
00577                 vuw=0; Ustrps++; Ndigits+=strip->GetNDaughters();
00578               }
00579               if(strip->GetPlaneView()==PlaneView::kV){
00580                 vuw=1; Vstrps++; Ndigits+=strip->GetNDaughters();
00581               }            
00582             }
00583             if(vuw==0) Uplns++; if(vuw==1) Vplns++;
00584           }
00585         }
00586         Nplns=Uplns+Vplns; Nstrps=Ustrps+Vstrps;
00587       }
00588        
00589       Int_t ipdg,muflag=0;
00590       if(simrec){     
00591         for(i=0;i<500;i++){  
00592           if(1+fMCStrpList[i].GetLast()>0 && 1+fTotStrpList[i].GetLast()>0){    
00593             for(j=0;j<1+fMCStrpList[i].GetLast();j++){
00594               REROOT_FLSHit* FLS_hit = (REROOT_FLSHit*)(fMCStrpList[i].At(j));
00595               ipdg = FLS_hit->IPDG(); 
00596               if( (IDnu==0&&(ipdg==13||ipdg==-13))
00597                 ||(IDnu==14&&ipdg==13)||(IDnu==-14&&ipdg==-13) ){
00598                 muflag=1;
00599               }
00600             }
00601             if(muflag) Nmuplns++;
00602           }
00603         }
00604       }
00605 
00606       // TRACKS
00607       if(tob->InheritsFrom("CandTrackAtNuListHandle")&&!TRK){
00608         CandTrackAtNuListHandle* trklist = (CandTrackAtNuListHandle*)(tob);
00609         MSG("AtNuTreeModule",Msg::kDebug) << " ... found CandTrackAtNuListHandle " << endl;
00610         TRK=1;
00611           
00612         Int_t pln,flag;
00613         Double_t dir,scr,maxscr,tmpscr;
00614                 
00615         TRKcputime=trklist->GetCPUTime();
00616         Ntrks=0; TRKlast=0;
00617         CandTrackAtNuHandle* trk=0; 
00618         flag=1; maxscr=9999;
00619         while(trk||flag){
00620           trk=0; 
00621           flag=0; tmpscr=0;
00622           TIter trkitr(trklist->GetDaughterIterator());
00623           while(CandTrackAtNuHandle* trackhandle = dynamic_cast<CandTrackAtNuHandle*>(trkitr())){
00624             if(trackhandle){
00625               if(trackhandle->GetEndPlane()>trackhandle->GetBegPlane()) scr=trackhandle->GetEndPlane()-trackhandle->GetBegPlane(); else scr=trackhandle->GetBegPlane()-trackhandle->GetEndPlane();
00626               if(scr>0&&scr<maxscr&&scr>tmpscr){
00627                 tmpscr=scr; trk=trackhandle;
00628               } 
00629             }
00630           }
00631           if(trk){
00632             Ntrks++; maxscr=tmpscr;
00633             if(TRKlast<3){
00634               MSG("AtNuTreeModule",Msg::kDebug) << "  track: " << TRKlast << endl;
00635               dir=3.0e8*trk->GetTimeSlope(); 
00636                
00637               TRKtrkPH[TRKlast]=trk->GetTrkPH();
00638               TRKshwPH[TRKlast]=trk->GetShwPH();
00639               TRKassocPH[TRKlast]=trk->GetAssocTrkPH();
00640               TRKassocPHfrac[TRKlast]=trk->GetAssocTrkPHfrac();
00641               TRKvtxpln[TRKlast]=trk->GetVtxPlane();                
00642               TRKtrkplns[TRKlast]=trk->GetTrackLikePlanes();
00643               TRKdir[TRKlast]=trk->GetDirTimeScore();
00644               TRKdirTimeSlope[TRKlast]=trk->GetDirTimeSlope();  
00645               TRKdirTimeScatter[TRKlast]=trk->GetDirTimeScatter();
00646               TRKrangeSteel[TRKlast]=trk->GetRangeThruSteel();
00647               TRKmomentumRange[TRKlast]=trk->GetMomentum();
00648               TRKreseeded[TRKlast]=trk->GetReseedFlag();
00649           
00650               if(dir>=0){
00651                 TRKbegpln[TRKlast]=trk->GetBegPlane(); 
00652                 TRKbegvtxX[TRKlast]=0.7071*(trk->GetVtxU()-trk->GetVtxV());
00653                 TRKbegvtxY[TRKlast]=0.7071*(trk->GetVtxU()+trk->GetVtxV());
00654                 TRKbegvtxZ[TRKlast]=trk->GetVtxZ();
00655                 TRKpbegX[TRKlast]=0.7071*(trk->GetDirCosU()-trk->GetDirCosV());
00656                 TRKpbegY[TRKlast]=0.7071*(trk->GetDirCosU()+trk->GetDirCosV());
00657                 TRKpbegZ[TRKlast]=trk->GetDirCosZ();
00658                 TRKbegvtxR[TRKlast]=trk->GetVtxR();
00659                 TRKbegvtxRdigits[TRKlast]=trk->GetVtxRdigits();
00660                 TRKbegplndigits[TRKlast]=trk->GetVtxPlaneDigits();
00661                 TRKbegtrace[TRKlast]=trk->GetVtxTrace();
00662                 TRKbegtraceZ[TRKlast]=trk->GetVtxTraceZ();
00663                 TRKbegvtxUwidth[TRKlast]=trk->GetVtxUwidth();
00664                 TRKbegvtxUmean[TRKlast]=trk->GetVtxUmean();
00665                 TRKbegvtxVwidth[TRKlast]=trk->GetVtxVwidth();
00666                 TRKbegvtxVmean[TRKlast]=trk->GetVtxVmean();
00667                 TRKbegvtxRmax[TRKlast]=trk->GetVtxRmax();
00668                 TRKbegvtxQmax[TRKlast]=trk->GetVtxQmax();
00669                 TRKendpln[TRKlast]=trk->GetEndPlane();
00670                 TRKendvtxX[TRKlast]=0.7071*(trk->GetEndU()-trk->GetEndV());
00671                 TRKendvtxY[TRKlast]=0.7071*(trk->GetEndU()+trk->GetEndV());
00672                 TRKendvtxZ[TRKlast]=trk->GetEndZ();
00673                 TRKpendX[TRKlast]=0.7071*(trk->GetEndDirCosU()-trk->GetEndDirCosV());
00674                 TRKpendY[TRKlast]=0.7071*(trk->GetEndDirCosU()+trk->GetEndDirCosV());
00675                 TRKpendZ[TRKlast]=trk->GetEndDirCosZ();
00676                 TRKendvtxR[TRKlast]=trk->GetEndR();
00677                 TRKendvtxRdigits[TRKlast]=trk->GetEndRdigits();
00678                 TRKendplndigits[TRKlast]=trk->GetEndPlaneDigits();
00679                 TRKendtrace[TRKlast]=trk->GetEndTrace();
00680                 TRKendtraceZ[TRKlast]=trk->GetEndTraceZ();
00681                 TRKendvtxUwidth[TRKlast]=trk->GetEndUwidth();
00682                 TRKendvtxUmean[TRKlast]=trk->GetEndUmean();
00683                 TRKendvtxVwidth[TRKlast]=trk->GetEndVwidth();
00684                 TRKendvtxVmean[TRKlast]=trk->GetEndVmean();
00685                 TRKendvtxRmax[TRKlast]=trk->GetEndRmax();
00686                 TRKendvtxQmax[TRKlast]=trk->GetEndQmax();
00687                 TRKplinX[TRKlast]=0.7071*(trk->GetLinearDirCosU()-trk->GetLinearDirCosV());
00688                 TRKplinY[TRKlast]=0.7071*(trk->GetLinearDirCosU()+trk->GetLinearDirCosV());
00689                 TRKplinZ[TRKlast]=trk->GetLinearDirCosZ();
00690                 TRKbegTimeFitRms[TRKlast]=trk->GetTimeForwardFitRMS();
00691                 TRKbegTimeFitNdf[TRKlast]=trk->GetTimeForwardFitNDOF();   
00692                 TRKendTimeFitRms[TRKlast]=trk->GetTimeBackwardFitRMS();
00693                 TRKendTimeFitNdf[TRKlast]=trk->GetTimeBackwardFitNDOF();     
00694                 TRKbegvtxshw[TRKlast]=trk->GetVtxShw();         
00695                 TRKbegvtxshwstrips[TRKlast]=trk->GetVtxShwStrips();   
00696                 TRKbegvtxshwreseeded[TRKlast]=trk->GetVtxShwReseedFlag();
00697                 TRKendvtxshw[TRKlast]=trk->GetEndShw();         
00698                 TRKendvtxshwstrips[TRKlast]=trk->GetEndShwStrips();   
00699                 TRKendvtxshwreseeded[TRKlast]=trk->GetEndShwReseedFlag();
00700               }
00701               else{
00702                 TRKbegpln[TRKlast]=trk->GetEndPlane();
00703                 TRKbegvtxX[TRKlast]=0.7071*(trk->GetEndU()-trk->GetEndV());
00704                 TRKbegvtxY[TRKlast]=0.7071*(trk->GetEndU()+trk->GetEndV());
00705                 TRKbegvtxZ[TRKlast]=trk->GetEndZ();
00706                 TRKpbegX[TRKlast]=-0.7071*(trk->GetEndDirCosU()-trk->GetEndDirCosV());
00707                 TRKpbegY[TRKlast]=-0.7071*(trk->GetEndDirCosU()+trk->GetEndDirCosV());
00708                 TRKpbegZ[TRKlast]=-trk->GetEndDirCosZ();
00709                 TRKbegvtxR[TRKlast]=trk->GetEndR();
00710                 TRKbegvtxRdigits[TRKlast]=trk->GetEndRdigits();
00711                 TRKbegplndigits[TRKlast]=trk->GetEndPlaneDigits();
00712                 TRKbegtrace[TRKlast]=trk->GetEndTrace();
00713                 TRKbegtraceZ[TRKlast]=trk->GetEndTraceZ();
00714                 TRKbegvtxUwidth[TRKlast]=trk->GetEndUwidth();
00715                 TRKbegvtxUmean[TRKlast]=trk->GetEndUmean();
00716                 TRKbegvtxVwidth[TRKlast]=trk->GetEndVwidth();
00717                 TRKbegvtxVmean[TRKlast]=trk->GetEndVmean();
00718                 TRKbegvtxRmax[TRKlast]=trk->GetEndRmax();
00719                 TRKbegvtxQmax[TRKlast]=trk->GetEndQmax();
00720                 TRKendpln[TRKlast]=trk->GetBegPlane(); 
00721                 TRKendvtxX[TRKlast]=0.7071*(trk->GetVtxU()-trk->GetVtxV());
00722                 TRKendvtxY[TRKlast]=0.7071*(trk->GetVtxU()+trk->GetVtxV());
00723                 TRKendvtxZ[TRKlast]=trk->GetVtxZ();
00724                 TRKpendX[TRKlast]=-0.7071*(trk->GetDirCosU()-trk->GetDirCosV());
00725                 TRKpendY[TRKlast]=-0.7071*(trk->GetDirCosU()+trk->GetDirCosV());
00726                 TRKpendZ[TRKlast]=-trk->GetDirCosZ();
00727                 TRKendvtxR[TRKlast]=trk->GetVtxR();
00728                 TRKendvtxRdigits[TRKlast]=trk->GetVtxRdigits();
00729                 TRKendplndigits[TRKlast]=trk->GetVtxPlaneDigits();
00730                 TRKendtrace[TRKlast]=trk->GetVtxTrace();
00731                 TRKendtraceZ[TRKlast]=trk->GetVtxTraceZ();
00732                 TRKendvtxUwidth[TRKlast]=trk->GetVtxUwidth();
00733                 TRKendvtxUmean[TRKlast]=trk->GetVtxUmean();
00734                 TRKendvtxVwidth[TRKlast]=trk->GetVtxVwidth();
00735                 TRKendvtxVmean[TRKlast]=trk->GetVtxVmean();
00736                 TRKendvtxRmax[TRKlast]=trk->GetVtxRmax();
00737                 TRKendvtxQmax[TRKlast]=trk->GetVtxQmax();
00738                 TRKplinX[TRKlast]=-0.7071*(trk->GetLinearDirCosU()-trk->GetLinearDirCosV());
00739                 TRKplinY[TRKlast]=-0.7071*(trk->GetLinearDirCosU()+trk->GetLinearDirCosV());
00740                 TRKplinZ[TRKlast]=-trk->GetLinearDirCosZ();
00741                 TRKbegTimeFitRms[TRKlast]=trk->GetTimeForwardFitRMS();
00742                 TRKbegTimeFitNdf[TRKlast]=trk->GetTimeForwardFitNDOF();   
00743                 TRKendTimeFitRms[TRKlast]=trk->GetTimeBackwardFitRMS();
00744                 TRKendTimeFitNdf[TRKlast]=trk->GetTimeBackwardFitNDOF();     
00745                 TRKbegvtxshw[TRKlast]=trk->GetEndShw();         
00746                 TRKbegvtxshwstrips[TRKlast]=trk->GetEndShwStrips();   
00747                 TRKbegvtxshwreseeded[TRKlast]=trk->GetEndShwReseedFlag();
00748                 TRKendvtxshw[TRKlast]=trk->GetVtxShw();         
00749                 TRKendvtxshwstrips[TRKlast]=trk->GetVtxShwStrips();   
00750                 TRKendvtxshwreseeded[TRKlast]=trk->GetVtxShwReseedFlag();
00751               }
00752 
00753               TIter stritr(trk->GetDaughterIterator());
00754               while(CandStripHandle* strp = dynamic_cast<CandStripHandle*>(stritr())){
00755                 if(strp){
00756                   pln=strp->GetPlane();
00757                   if(pln>0 && pln<500){
00758                     fTrkStrpList[pln].Add(strp);
00759                   }
00760                 }
00761               }
00762 
00763               Double_t range=0.0,ds=0.0;
00764               for(i=0;i<500;i++){
00765                 if(1+fTrkStrpList[i].GetLast()>0){
00766                   if(trk->IsTPosValid(i)){
00767                     ds=trk->GetdS(i);
00768                     if(ds>range) range=ds;
00769                   }
00770                   TRKplns[TRKlast]++;
00771                   for(j=0;j<1+fTrkStrpList[i].GetLast();j++){
00772                     CandStripHandle* strip = (CandStripHandle*)(fTrkStrpList[i].At(j));
00773                     TRKstrps[TRKlast]++; TRKdigits[TRKlast]+=strip->GetNDaughters();
00774                   }
00775                 }
00776               }
00777               TRKrange[TRKlast]=range;
00778 
00779               if(simrec){
00780                 Int_t muflag,muflagtrk,piflag,piflagtrk;
00781                 Int_t trueview,packedPEC,trueplane,truecell,trueext,truestrip,ipdg;
00782                 Double_t trk_pln=0,trk_mu=0.0,trk_pi=0.0,notrk_mu=0.0,notrk_pi=0.0;
00783                 for(i=0;i<500;i++){
00784                   if(1+fMCStrpList[i].GetLast()>0 && 1+fTotStrpList[i].GetLast()>0){
00785                     muflag=0; muflagtrk=0; piflag=0; piflagtrk=0;
00786                     for(j=0;j<1+fMCStrpList[i].GetLast();j++){
00787                       REROOT_FLSHit* FLS_hit = (REROOT_FLSHit*)(fMCStrpList[i].At(j));
00788                       packedPEC=FLS_hit->IPackedPEC();
00789                       trueplane=(Int_t)(packedPEC/65536.0);
00790                       trueext=(Int_t)((packedPEC-trueplane*65536)/256.0);
00791                       truecell=packedPEC-trueplane*65536-trueext*256;
00792                       truestrip=StrpExtr[trueext-1]+StrpCell[truecell-1];
00793                       ipdg = FLS_hit->IPDG();
00794                       PlexPlaneId trueplnid(vldc->GetDetector(),trueplane,0);
00795                       UgliScintPlnHandle trueplnhandle = ugh.GetScintPlnHandle(trueplnid);
00796                       if(trueplnhandle.GetPlaneView()==PlaneView::kU) trueview = 0;
00797                       if(trueplnhandle.GetPlaneView()==PlaneView::kV) trueview = 1;   
00798                       if( (IDnu==0&&(ipdg==13||ipdg==-13))
00799                         ||(IDnu==14&&ipdg==13)||(IDnu==-14&&ipdg==-13) ){
00800                         muflag=1;
00801                         for(k=0;k<1+fTrkStrpList[i].GetLast();k++){
00802                           CandStripHandle* strp = (CandStripHandle*)(fTrkStrpList[i].At(k));
00803                           if(strp->GetStrip()-truestrip>-2 && strp->GetStrip()-truestrip<2){
00804                             muflagtrk=1;
00805                           }
00806                         }
00807                       }
00808                       if(ipdg==211||ipdg==-211){
00809                         piflag=1;
00810                         for(k=0;k<1+fTrkStrpList[i].GetLast();k++){
00811                           CandStripHandle* strp = (CandStripHandle*)(fTrkStrpList[i].At(k));
00812                           if(strp->GetStrip()-truestrip>-2 && strp->GetStrip()-truestrip<2){
00813                             piflagtrk=1;
00814                           }
00815                         }
00816                       }          
00817                     }
00818                     if(muflag){ if(muflagtrk) trk_mu+=1.0; else notrk_mu+=1.0; }     
00819                     if(piflag){ if(piflagtrk) trk_pi+=1.0; else notrk_pi+=1.0; }
00820                     if(1+fTrkStrpList[i].GetLast()>0) trk_pln+=1.0;
00821                   }
00822                 }
00823                 if(trk_pln>0){
00824                   TRKscore[TRKlast] = (trk_mu)/(trk_pln+notrk_mu);
00825                   if(trk_mu+notrk_mu>0.0){
00826                     TRKscoreMuEff[TRKlast] = (trk_mu)/(trk_mu+notrk_mu); 
00827                     TRKscoreMuPur[TRKlast]= (trk_mu)/(trk_pln);
00828                   }
00829                   if(trk_pi+notrk_pi>0.0){ 
00830                     TRKscorePiEff[TRKlast] = (trk_pi)/(trk_pi+notrk_pi); 
00831                     TRKscorePiPur[TRKlast] = (trk_pi)/(trk_pln);
00832                   }
00833                 }
00834 
00835                 Double_t begZ,endZ;
00836                 begZ=TRKbegvtxZ[TRKlast]; endZ=TRKendvtxZ[TRKlast];
00837                 if(endZ>begZ){
00838                   TRKdirTrue[TRKlast]=2.0*(0.5*(endZ+begZ)-vtxZ)/(endZ-begZ);
00839                 }
00840               }
00841 
00842               MSG("AtNuTreeModule",Msg::kDebug)
00843                 << " RESULTS FROM TRACKS " << endl
00844                 << " ------------------- " << endl
00845                 << " TRKplns = " << TRKplns[TRKlast] << endl
00846                 << " TRKstrps = " << TRKstrps[TRKlast] << endl
00847                 << " TRKdigits = " << TRKdigits[TRKlast] << endl
00848                 << " TRKvtxpln = " << TRKvtxpln[TRKlast] << endl
00849                 << " TRKbegpln = " << TRKbegpln[TRKlast] << endl
00850                 << " TRKendpln = " << TRKendpln[TRKlast] << endl
00851                 << " TRKtrkplns = " << TRKtrkplns[TRKlast] << endl
00852                 << " TRKtrkPH = " << TRKtrkPH[TRKlast] << endl
00853                 << " TRKshwPH = " << TRKshwPH[TRKlast] << endl
00854                 << " TRKassocPH = " << TRKassocPH[TRKlast] << endl
00855                 << " TRKassocPHfrac = " << TRKassocPHfrac[TRKlast] << endl
00856                 << " TRKpbegX = " << TRKpbegX[TRKlast] << endl
00857                 << " TRKpbegY = " << TRKpbegY[TRKlast] << endl
00858                 << " TRKpbegZ = " << TRKpbegZ[TRKlast] << endl
00859                 << " TRKpendX = " << TRKpendX[TRKlast] << endl
00860                 << " TRKpendY = " << TRKpendY[TRKlast] << endl
00861                 << " TRKpendZ = " << TRKpendZ[TRKlast] << endl
00862                 << " TRKplinX = " << TRKplinX[TRKlast] << endl
00863                 << " TRKplinY = " << TRKplinY[TRKlast] << endl
00864                 << " TRKplinZ = " << TRKplinZ[TRKlast] << endl
00865                 << " TRKbegvtxX = " << TRKbegvtxX[TRKlast] << endl
00866                 << " TRKbegvtxY = " << TRKbegvtxY[TRKlast] << endl
00867                 << " TRKbegvtxZ = " << TRKbegvtxZ[TRKlast] << endl
00868                 << " TRKbegvtxR = " << TRKbegvtxR[TRKlast] << endl
00869                 << " TRKbegvtxRdigits = " << TRKbegvtxRdigits[TRKlast] << endl
00870                 << " TRKbegplndigits = " << TRKbegplndigits[TRKlast] << endl
00871                 << " TRKbegtrace = " << TRKbegtrace[TRKlast] << endl
00872                 << " TRKbegtraceZ = " << TRKbegtraceZ[TRKlast] << endl
00873                 << " TRKbegvtxUwidth = " << TRKbegvtxUwidth[TRKlast] << endl
00874                 << " TRKbegvtxUmean = " << TRKbegvtxUmean[TRKlast] << endl
00875                 << " TRKbegvtxVwidth = " << TRKbegvtxVwidth[TRKlast] << endl
00876                 << " TRKbegvtxVmean = " << TRKbegvtxVmean[TRKlast] << endl
00877                 << " TRKbegvtxRmax = " << TRKbegvtxRmax[TRKlast] << endl
00878                 << " TRKbegvtxQmax = " << TRKbegvtxQmax[TRKlast] << endl
00879                 << " TRKendvtxX = " << TRKendvtxX[TRKlast] << endl
00880                 << " TRKendvtxY = " << TRKendvtxY[TRKlast] << endl
00881                 << " TRKendvtxZ = " << TRKendvtxZ[TRKlast] << endl
00882                 << " TRKendvtxR = " << TRKendvtxR[TRKlast] << endl
00883                 << " TRKendvtxRdigits = " << TRKendvtxRdigits[TRKlast] << endl
00884                 << " TRKendplndigits = " << TRKendplndigits[TRKlast] << endl
00885                 << " TRKendtrace = " << TRKendtrace[TRKlast] << endl
00886                 << " TRKendtraceZ = " << TRKendtraceZ[TRKlast] << endl
00887                 << " TRKendvtxUwidth = " << TRKendvtxUwidth[TRKlast] << endl 
00888                 << " TRKendvtxUmean = " << TRKendvtxUmean[TRKlast] << endl 
00889                 << " TRKendvtxVwidth = " << TRKendvtxVwidth[TRKlast] << endl 
00890                 << " TRKendvtxVmean = " << TRKendvtxVmean[TRKlast] << endl 
00891                 << " TRKendvtxRmax = " << TRKendvtxRmax[TRKlast] << endl 
00892                 << " TRKendvtxQmax = " << TRKendvtxQmax[TRKlast] << endl
00893                 << " TRKdir = " << TRKdir[TRKlast] << endl 
00894                 << " TRKdirTrue = " << TRKdirTrue[TRKlast] << endl
00895                 << " TRKdirTimeSlope = " << TRKdirTimeSlope[TRKlast] << endl
00896                 << " TRKdirTimeScatter = " << TRKdirTimeScatter[TRKlast] << endl
00897                 << " TRKbegTimeFitRms = " << TRKbegTimeFitRms[TRKlast] << endl
00898                 << " TRKbegTimeFitNdf = " << TRKbegTimeFitNdf[TRKlast] << endl
00899                 << " TRKendTimeFitRms = " << TRKendTimeFitRms[TRKlast] << endl
00900                 << " TRKendTimeFitNdf = " << TRKendTimeFitNdf[TRKlast] << endl
00901                 << " TRKbegvtxshw = " << TRKbegvtxshw[TRKlast] << endl
00902                 << " TRKbegvtxshwstrips = " << TRKbegvtxshwstrips[TRKlast] << endl
00903                 << " TRKbegvtxshwreseeded = " << TRKbegvtxshwreseeded[TRKlast] << endl 
00904                 << " TRKendvtxshw = " << TRKendvtxshw[TRKlast] << endl
00905                 << " TRKendvtxshwstrips = " << TRKendvtxshwstrips[TRKlast] << endl
00906                 << " TRKendvtxshwreseeded = " << TRKendvtxshwreseeded[TRKlast] << endl
00907                 << " TRKrange = " << TRKrange[TRKlast] << endl 
00908                 << " TRKrangeSteel = " << TRKrangeSteel[TRKlast] << endl
00909                 << " TRKmomentumRange = " << TRKmomentumRange[TRKlast] << endl
00910                 << " TRKscore = " << TRKscore[TRKlast] << endl
00911                 << " TRKscoreMuEff = " << TRKscoreMuEff[TRKlast] << endl
00912                 << " TRKscoreMuPur = " << TRKscoreMuPur[TRKlast] << endl 
00913                 << " TRKscorePiEff = " << TRKscorePiEff[TRKlast] << endl
00914                 << " TRKscorePiPur = " << TRKscorePiPur[TRKlast] << endl 
00915                 << " TRKreseeded = " << TRKreseeded[TRKlast] << endl;
00916 
00917               TRKlast++;            
00918             } 
00919           }
00920         }    
00921       }
00922 
00923 
00924       // SHOWERS
00925       if(tob->InheritsFrom("CandShowerAtNuListHandle")&&!SHW){
00926         CandShowerAtNuListHandle* shwlist = (CandShowerAtNuListHandle*)(tob);
00927         MSG("AtNuTreeModule",Msg::kDebug) << " ... found CandShowerAtNuListHandle " << endl;
00928         SHW=1; 
00929 
00930         Int_t pln,flag;
00931         Double_t dir,scr,tmpscr,maxscr;
00932 
00933         SHWcputime=shwlist->GetCPUTime();
00934         Nshws=0; SHWlast=0;
00935         CandShowerAtNuHandle* shw=0; 
00936         flag=1; maxscr=9999;
00937         while(shw||flag){
00938           shw=0; 
00939           flag=0; tmpscr=0;
00940           TIter shwitr(shwlist->GetDaughterIterator());
00941           while(CandShowerAtNuHandle* showerhandle = dynamic_cast<CandShowerAtNuHandle*>(shwitr())){
00942             if(showerhandle){
00943               scr=0;
00944               TIter stritr(showerhandle->GetDaughterIterator());
00945               while(CandStripHandle* strp = dynamic_cast<CandStripHandle*>(stritr())){
00946                 if(strp) scr++;
00947               }
00948               if(scr>0&&scr<maxscr&&scr>tmpscr){
00949                 tmpscr=scr; shw=showerhandle;
00950               } 
00951             }
00952           }
00953           if(shw){
00954             Nshws++; maxscr=tmpscr;
00955             if(SHWlast<3){
00956               MSG("AtNuTreeModule",Msg::kDebug) << "  shower: " << SHWlast << endl;
00957               dir=3.0e8*shw->GetTimeSlope();
00958             
00959               SHWvtxpln[SHWlast]=shw->GetVtxPlane();
00960               SHWvtxX[SHWlast]=0.7071*(shw->GetVtxU()-shw->GetVtxV());
00961               SHWvtxY[SHWlast]=0.7071*(shw->GetVtxU()+shw->GetVtxV());
00962               SHWvtxZ[SHWlast]=shw->GetVtxZ();
00963               SHWdir[SHWlast]=shw->GetDirTimeScore();
00964               SHWvtxshw[SHWlast]=shw->GetVtxShw();
00965               SHWdirTrk[SHWlast]=shw->GetDirVtxShwScore();
00966               SHWwidthU[SHWlast]=shw->GetDirCosErrU();
00967               SHWwidthV[SHWlast]=shw->GetDirCosErrV();
00968               SHWenergyPH[SHWlast]=shw->GetEnergy();
00969               SHWenergyNstrps[SHWlast]=0.0;
00970               SHWreseeded[SHWlast]=shw->GetReseedFlag();                       
00971  
00972               if(dir>=0){
00973                 SHWbegpln[SHWlast]=shw->GetBegPlane();
00974                 SHWendpln[SHWlast]=shw->GetEndPlane();
00975                 SHWpshwX[SHWlast]=0.7071*(shw->GetDirCosU()-shw->GetDirCosV());
00976                 SHWpshwY[SHWlast]=0.7071*(shw->GetDirCosU()+shw->GetDirCosV());
00977                 SHWpshwZ[SHWlast]=shw->GetDirCosZ();               
00978               }
00979               else{
00980                 SHWbegpln[SHWlast]=shw->GetEndPlane();
00981                 SHWendpln[SHWlast]=shw->GetBegPlane();
00982                 SHWpshwX[SHWlast]=-0.7071*(shw->GetDirCosU()-shw->GetDirCosV());
00983                 SHWpshwY[SHWlast]=-0.7071*(shw->GetDirCosU()+shw->GetDirCosV());
00984                 SHWpshwZ[SHWlast]=-shw->GetDirCosZ();   
00985               }
00986 
00987               TIter stritr(shw->GetDaughterIterator());
00988               while(CandStripHandle* strp = dynamic_cast<CandStripHandle*>(stritr())){
00989                 if(strp){
00990                   pln=strp->GetPlane();
00991                   if(pln>0 && pln<500){
00992                     fShwStrpList[pln].Add(strp);
00993                   }
00994                 }
00995               }
00996 
00997               for(i=0;i<500;i++){
00998                 if(1+fShwStrpList[i].GetLast()>0){
00999                   SHWplns[SHWlast]++;
01000                   for(j=0;j<1+fShwStrpList[i].GetLast();j++){
01001                     CandStripHandle* strip = (CandStripHandle*)(fShwStrpList[i].At(j));
01002                     SHWtotPH[SHWlast]+=strip->GetCharge();
01003                     SHWstrps[SHWlast]++; SHWdigits[SHWlast]+=strip->GetNDaughters();
01004                   }
01005                 }
01006               }
01007 
01008               if(simrec){
01009                 if(PhadX*PhadX+PhadY*PhadY+PhadZ*PhadZ>0.0){
01010                   SHWdirTrue[SHWlast]=PhadZ/sqrt(PhadX*PhadX+PhadY*PhadY+PhadZ*PhadZ);
01011                 }
01012               }
01013             
01014               MSG("AtNuTreeModule",Msg::kDebug)
01015                 << " RESULTS FROM SHOWER " << endl
01016                 << " ------------------- " << endl
01017                 << " SHWplns = " << SHWplns[SHWlast] << endl
01018                 << " SHWstrps = " << SHWstrps[SHWlast] << endl
01019                 << " SHWdigits = " << SHWdigits[SHWlast] << endl
01020                 << " SHWvtxpln = " << SHWvtxpln[SHWlast] << endl
01021                 << " SHWbegpln = " << SHWbegpln[SHWlast] << endl
01022                 << " SHWendpln = " << SHWendpln[SHWlast] << endl
01023                 << " SHWtotPH = " << SHWtotPH[SHWlast] << endl
01024                 << " SHWpshwX = " << SHWpshwX[SHWlast] << endl
01025                 << " SHWpshwY = " << SHWpshwY[SHWlast] << endl
01026                 << " SHWpshwZ = " << SHWpshwZ[SHWlast] << endl
01027                 << " SHWwidthU = " << SHWwidthU[SHWlast] << endl
01028                 << " SHWwidthV = " << SHWwidthV[SHWlast] << endl
01029                 << " SHWvtxX = " << SHWvtxX[SHWlast] << endl
01030                 << " SHWvtxY = " << SHWvtxY[SHWlast] << endl
01031                 << " SHWvtxZ = " << SHWvtxZ[SHWlast] << endl
01032                 << " SHWdir = " << SHWdir[SHWlast] << endl
01033                 << " SHWdirTrue = " << SHWdirTrue[SHWlast] << endl
01034                 << " SHWvtxshw = " << SHWvtxshw[SHWlast] << endl
01035                 << " SHWdirTrk = " << SHWdirTrk[SHWlast] << endl
01036                 << " SHWenergyPH = " << SHWenergyPH[SHWlast] << endl
01037                 << " SHWenergyNstrps = " << SHWenergyNstrps[SHWlast] << endl
01038                 << " SHWreseeded = " << SHWreseeded[SHWlast] << endl;
01039 
01040               SHWlast++;        
01041             }
01042           }
01043         }
01044       }
01045 
01046       // FITTED TRACKS
01047       if(tob->InheritsFrom("CandFitTrackAtNuListHandle")&&!FIT){
01048         CandFitTrackAtNuListHandle* fitlist = (CandFitTrackAtNuListHandle*)(tob);
01049         MSG("AtNuTreeModule",Msg::kDebug) << " ... found CandFitTrackAtNuListHandle " << endl;
01050         FIT=1;
01051 
01052         Int_t flag;
01053         Double_t dir,scr,tmpscr,maxscr;
01054 
01055         Nfits=0; FITlast=0;
01056         CandFitTrackAtNuHandle* fit=0; 
01057         flag=1; maxscr=9999;
01058         while(fit||flag){
01059           fit=0; 
01060           flag=0; tmpscr=0;
01061           TIter fititr(fitlist->GetDaughterIterator());
01062           while(CandFitTrackAtNuHandle* fithandle = dynamic_cast<CandFitTrackAtNuHandle*>(fititr())){
01063             if(fithandle){
01064               if(fithandle->GetEndPlane()>fithandle->GetBegPlane()) scr=fithandle->GetEndPlane()-fithandle->GetBegPlane(); else scr=fithandle->GetBegPlane()-fithandle->GetEndPlane();
01065               if(scr>0&&scr<maxscr&&scr>tmpscr){
01066                 tmpscr=scr; fit=fithandle;
01067               } 
01068             }
01069           }
01070           if(fit){
01071             Nfits++; maxscr=tmpscr;
01072             if(FITlast<3){
01073               MSG("AtNuTreeModule",Msg::kDebug) << "  fitted track: " << FITlast << endl;
01074               dir=3.0e8*fit->GetTimeSlope();                
01075 
01076               FITcharge[FITlast]=fit->GetEMCharge();
01077               FITchisq[FITlast]=fit->GetChi2();
01078               FITchisqlin[FITlast]=fit->GetChi2Lin();
01079               FITQPmean[FITlast]=fit->GetQPmean();
01080               FITQPerr[FITlast]=fit->GetQPerr();
01081               FITQPcorr[FITlast]=fit->GetQPcorr();
01082               FITQPwidth[FITlast]=fit->GetQPwidth();
01083               FITQPplns[FITlast]=fit->GetQPplns();
01084               FITmomentumCurve[FITlast]=fit->GetMomentumCurve();
01085               FITmomentumCurveErr[FITlast]=fit->GetMomentumCurveErr();
01086               FITpass[FITlast]=fit->GetPass();
01087                 
01088               if(dir>=0.0){ 
01089                 FITvtxpln[FITlast]=fit->GetVtxPlane();
01090                 FITbegpln[FITlast]=fit->GetBegPlane();
01091                 FITendpln[FITlast]=fit->GetEndPlane();
01092               }
01093               else{
01094                 FITvtxpln[FITlast]=fit->GetVtxPlane();
01095                 FITbegpln[FITlast]=fit->GetEndPlane();
01096                 FITendpln[FITlast]=fit->GetBegPlane();
01097               }
01098 
01099               MSG("AtNuTreeModule",Msg::kDebug)
01100                 << " RESULTS FROM FITTED TRACK " << endl
01101                 << " ------------------------- " << endl
01102                 << " FITcputime = " << FITcputime[FITlast] << endl    
01103                 << " FITvtxpln = " << FITvtxpln[FITlast] << endl 
01104                 << " FITbegpln = " << FITbegpln[FITlast] << endl
01105                 << " FITendpln = " << FITendpln[FITlast] << endl        
01106                 << " FITcharge = " << FITcharge[FITlast] << endl
01107                 << " FITchisqlin = " << FITchisqlin[FITlast] << endl
01108                 << " FITchisq = " << FITchisq[FITlast] << endl
01109                 << " FITQPmean = " << FITQPmean[FITlast] << endl
01110                 << " FITQPerr = " << FITQPerr[FITlast] << endl
01111                 << " FITQPcorr = " << FITQPcorr[FITlast] << endl
01112                 << " FITQPwidth = " << FITQPwidth[FITlast] << endl
01113                 << " FITQPplns = " << FITQPplns[FITlast] << endl
01114                 << " FITmomentumCurve = " << FITmomentumCurve[FITlast] << endl
01115                 << " FITmomentumCurveErr = " << FITmomentumCurveErr[FITlast] << endl
01116                 << " FITpass = " << FITpass[FITlast] << endl;
01117                 
01118               FITlast++;
01119             }
01120           }
01121         }
01122       }
01123 
01124       MSG("AtNuTreeModule",Msg::kDebug) << " ... next object?" << endl;
01125     }
01126   }
01127 
01128   MSG("AtNuTreeModule",Msg::kDebug) << " *** END OF CANDRECORD *** " << endl;
01129 
01130   for(i=0;i<500;i++){
01131     fTotStrpList[i].Clear();
01132     fTrkStrpList[i].Clear();
01133     fShwStrpList[i].Clear();
01134     fMCStrpList[i].Clear();
01135   }
01136 
01137 
01138   /***************************
01139    * S A V E   T O   F I L E *
01140    ***************************/
01141 
01142   MSG("AtNuTreeModule",Msg::kDebug) << " *** SAVE TO FILE *** " << endl;
01143   if(!fAtNuFile && run>0){
01144     TDirectory* tmpd = gDirectory;
01145 
01146     //TString filename("./results/atnutree");
01147     //if(run>=0){ filename.Append("."); filename+=run; }
01148     //if(subrun>=0){ filename.Append("."); filename+=subrun; }
01149     //filename.Append(".root");
01150     //TString filename("atnutree.root");
01151     TString filename(fAtNuFileName.Data());
01152     filename.Append(".root");
01153     MSG("AtNuTreeModule",Msg::kDebug) << "      ..." << filename.Data() << endl;
01154 
01155     fAtNuFile = new TFile(filename.Data(),"RECREATE");
01156     fAtNuTree = new TTree("AtNuTree","AtNuTree");
01157 
01158     fAtNuTree->SetAutoSave(100);
01159 
01160     fAtNuTree->Branch("run",&run,"run/I");
01161     fAtNuTree->Branch("subrun",&subrun,"subrun/I");
01162     fAtNuTree->Branch("snarl",&snarl,"snarl/I");
01163     fAtNuTree->Branch("runtype",&runtype,"runtype/I");
01164     fAtNuTree->Branch("trigsrc",&trigsrc,"trigsrc/I");  
01165     fAtNuTree->Branch("date",&date,"date/I");
01166     fAtNuTree->Branch("time",&time,"time/I");
01167     fAtNuTree->Branch("timeframe",&timeframe,"timeframe/I");
01168     fAtNuTree->Branch("trigtimeraw",&trigtimeraw,"trigtimeraw/D");
01169     fAtNuTree->Branch("trigtimecorr",&trigtimecorr,"trigtimecorr/D");
01170 
01171     fAtNuTree->Branch("Ndigits",&Ndigits,"Ndigits/I");
01172     fAtNuTree->Branch("Nstrps",&Nstrps,"Nstrps/I");
01173     fAtNuTree->Branch("Nplns",&Nplns,"Nplns/I");
01174     fAtNuTree->Branch("Ustrps",&Ustrps,"Ustrps/I");
01175     fAtNuTree->Branch("Uplns",&Uplns,"Uplns/I");
01176     fAtNuTree->Branch("Vstrps",&Vstrps,"Vstrps/I");
01177     fAtNuTree->Branch("Vplns",&Vplns,"Vplns/I");
01178     fAtNuTree->Branch("begpln",&begpln,"begpln/I");
01179     fAtNuTree->Branch("endpln",&endpln,"endpln/I"); 
01180     fAtNuTree->Branch("Nmuplns",&Nmuplns,"Nmuplns/I");
01181     
01182     fAtNuTree->Branch("totPH",&totPH,"totPH/D");
01183 
01184     fAtNuTree->Branch("IDnu",&IDnu,"IDnu/I");
01185     fAtNuTree->Branch("IDact",&IDact,"IDact/I");
01186     fAtNuTree->Branch("IDboson",&IDboson,"IDboson/I");
01187     fAtNuTree->Branch("IDtarget",&IDtarget,"IDtarget/I");     
01188     fAtNuTree->Branch("IDres",&IDres,"IDres/I"); 
01189     fAtNuTree->Branch("x",&x,"x/D"); 
01190     fAtNuTree->Branch("y",&y,"y/D"); 
01191     fAtNuTree->Branch("Q2",&Q2,"Q2/D"); 
01192     fAtNuTree->Branch("W2",&W2,"W2/D"); 
01193     fAtNuTree->Branch("EMfrac",&EMfrac,"EMfrac/D");
01194     fAtNuTree->Branch("Xsection",&Xsection,"Xsection/D");
01195     fAtNuTree->Branch("PnuX",&PnuX,"PnuX/D"); 
01196     fAtNuTree->Branch("PnuY",&PnuY,"PnuY/D"); 
01197     fAtNuTree->Branch("PnuZ",&PnuZ,"PnuZ/D");
01198     fAtNuTree->Branch("Enu",&Enu,"Enu/D"); 
01199     fAtNuTree->Branch("PmuX",&PmuX,"PmuX/D"); 
01200     fAtNuTree->Branch("PmuY",&PmuY,"PmuY/D"); 
01201     fAtNuTree->Branch("PmuZ",&PmuZ,"PmuZ/D"); 
01202     fAtNuTree->Branch("Emu",&Emu,"Emu/D");
01203     fAtNuTree->Branch("PelX",&PelX,"PelX/D"); 
01204     fAtNuTree->Branch("PelY",&PelY,"PelY/D"); 
01205     fAtNuTree->Branch("PelZ",&PelZ,"PelZ/D"); 
01206     fAtNuTree->Branch("Eel",&Eel,"Eel/D"); 
01207     fAtNuTree->Branch("PhadX",&PhadX,"PhadX/D"); 
01208     fAtNuTree->Branch("PhadY",&PhadY,"PhadY/D"); 
01209     fAtNuTree->Branch("PhadZ",&PhadZ,"PhadZ/D"); 
01210     fAtNuTree->Branch("Ehad",&Ehad,"Ehad/D"); 
01211     fAtNuTree->Branch("PtargX",&PtargX,"PtargX/D"); 
01212     fAtNuTree->Branch("PtargY",&PtargY,"PtargY/D"); 
01213     fAtNuTree->Branch("PtargZ",&PtargZ,"PtargZ/D"); 
01214     fAtNuTree->Branch("Etarg",&Etarg,"Etarg/D");
01215     fAtNuTree->Branch("vtxX",&vtxX,"vtxX/D");
01216     fAtNuTree->Branch("vtxY",&vtxY,"vtxY/D");
01217     fAtNuTree->Branch("vtxZ",&vtxZ,"vtxZ/D"); 
01218     fAtNuTree->Branch("muvtxX",&muvtxX,"muvtxX/D");
01219     fAtNuTree->Branch("muvtxY",&muvtxY,"muvtxY/D");
01220     fAtNuTree->Branch("muvtxZ",&muvtxZ,"muvtxZ/D"); 
01221     fAtNuTree->Branch("muvtxR",&muvtxR,"muvtxR/D");
01222     fAtNuTree->Branch("muvtxpln",&muvtxpln,"muvtxpln/I");
01223     fAtNuTree->Branch("muendvtxX",&muendvtxX,"muendvtxX/D");
01224     fAtNuTree->Branch("muendvtxY",&muendvtxY,"muendvtxY/D");
01225     fAtNuTree->Branch("muendvtxZ",&muendvtxZ,"muendvtxZ/D"); 
01226     fAtNuTree->Branch("muendvtxR",&muendvtxR,"muendvtxR/D"); 
01227     fAtNuTree->Branch("muendvtxpln",&muendvtxpln,"muendvtxpln/I"); 
01228     fAtNuTree->Branch("mupbeg",&mupbeg,"mupbeg/D");
01229     fAtNuTree->Branch("mupend",&mupend,"mupend/D");
01230 
01231     fAtNuTree->Branch("Ntrks",&Ntrks,"Ntrks/I");
01232     fAtNuTree->Branch("TRKlast",&TRKlast,"TRKlast/I"); 
01233     fAtNuTree->Branch("TRKcputime",&TRKcputime,"TRKcputime/D");
01234     fAtNuTree->Branch("TRKplns",TRKplns,"TRKplns[3]/I");
01235     fAtNuTree->Branch("TRKstrps",TRKstrps,"TRKstrps[3]/I");
01236     fAtNuTree->Branch("TRKdigits",TRKdigits,"TRKdigits[3]/I");
01237     fAtNuTree->Branch("TRKvtxpln",TRKvtxpln,"TRKvtxpln[3]/I");
01238     fAtNuTree->Branch("TRKbegpln",TRKbegpln,"TRKbegpln[3]/I");
01239     fAtNuTree->Branch("TRKendpln", TRKendpln,"TRKendpln[3]/I");
01240     fAtNuTree->Branch("TRKtrkplns",TRKtrkplns,"TRKtrkplns[3]/I");
01241     fAtNuTree->Branch("TRKtrkPH",TRKtrkPH,"TRKtrkPH[3]/D");
01242     fAtNuTree->Branch("TRKshwPH",TRKshwPH,"TRKshwPH[3]/D");
01243     fAtNuTree->Branch("TRKassocPH",TRKassocPH,"TRKassocPH[3]/D");
01244     fAtNuTree->Branch("TRKassocPHfrac",TRKassocPHfrac,"TRKassocPHfrac[3]/D");
01245     fAtNuTree->Branch("TRKpbegX",TRKpbegX,"TRKpbegX[3]/D");
01246     fAtNuTree->Branch("TRKpbegY",TRKpbegY,"TRKpbegY[3]/D");
01247     fAtNuTree->Branch("TRKpbegZ",TRKpbegZ,"TRKpbegZ[3]/D");
01248     fAtNuTree->Branch("TRKpendX",TRKpendX,"TRKpendX[3]/D");
01249     fAtNuTree->Branch("TRKpendY",TRKpendY,"TRKpendY[3]/D");
01250     fAtNuTree->Branch("TRKpendZ",TRKpendZ,"TRKpendZ[3]/D");
01251     fAtNuTree->Branch("TRKplinX",TRKplinX,"TRKplinX[3]/D");
01252     fAtNuTree->Branch("TRKplinY",TRKplinY,"TRKplinY[3]/D");
01253     fAtNuTree->Branch("TRKplinZ",TRKplinZ,"TRKplinZ[3]/D");
01254     fAtNuTree->Branch("TRKbegvtxX",TRKbegvtxX,"TRKbegvtxX[3]/D");
01255     fAtNuTree->Branch("TRKbegvtxY",TRKbegvtxY,"TRKbegvtxY[3]/D");
01256     fAtNuTree->Branch("TRKbegvtxZ",TRKbegvtxZ,"TRKbegvtxZ[3]/D");
01257     fAtNuTree->Branch("TRKbegvtxR",TRKbegvtxR,"TRKbegvtxR[3]/D");
01258     fAtNuTree->Branch("TRKbegvtxRdigits",TRKbegvtxRdigits,"TRKbegvtxRdigits[3]/D");
01259     fAtNuTree->Branch("TRKbegplndigits",TRKbegplndigits,"TRKbegplndigits[3]/I");
01260     fAtNuTree->Branch("TRKbegtrace",TRKbegtrace,"TRKbegtrace[3]/D");
01261     fAtNuTree->Branch("TRKbegtraceZ",TRKbegtraceZ,"TRKbegtraceZ[3]/D");
01262     fAtNuTree->Branch("TRKbegvtxUwidth",TRKbegvtxUwidth,"TRKbegvtxUwidth[3]/D");
01263     fAtNuTree->Branch("TRKbegvtxUmean",TRKbegvtxUmean,"TRKbegvtxUmean[3]/D");
01264     fAtNuTree->Branch("TRKbegvtxVwidth",TRKbegvtxVwidth,"TRKbegvtxVwidth[3]/D");
01265     fAtNuTree->Branch("TRKbegvtxVmean",TRKbegvtxVmean,"TRKbegvtxVmean[3]/D");
01266     fAtNuTree->Branch("TRKbegvtxRmax",TRKbegvtxRmax,"TRKbegvtxRmax[3]/D");
01267     fAtNuTree->Branch("TRKbegvtxQmax",TRKbegvtxQmax,"TRKbegvtxQmax[3]/D");
01268     fAtNuTree->Branch("TRKendvtxX",TRKendvtxX,"TRKendvtxX[3]/D");
01269     fAtNuTree->Branch("TRKendvtxY",TRKendvtxY,"TRKendvtxY[3]/D");
01270     fAtNuTree->Branch("TRKendvtxZ",TRKendvtxZ,"TRKendvtxZ[3]/D");
01271     fAtNuTree->Branch("TRKendvtxR",TRKendvtxR,"TRKendvtxR[3]/D");
01272     fAtNuTree->Branch("TRKendvtxRdigits",TRKendvtxRdigits,"TRKendvtxRdigits[3]/D");
01273     fAtNuTree->Branch("TRKendplndigits",TRKendplndigits,"TRKendplndigits[3]/I");
01274     fAtNuTree->Branch("TRKendtrace",TRKendtrace,"TRKendtrace[3]/D");
01275     fAtNuTree->Branch("TRKendtraceZ",TRKendtraceZ,"TRKendtraceZ[3]/D");
01276     fAtNuTree->Branch("TRKendvtxUwidth",TRKendvtxUwidth,"TRKendvtxUwidth[3]/D");
01277     fAtNuTree->Branch("TRKendvtxUmean",TRKendvtxUmean,"TRKendvtxUmean[3]/D");
01278     fAtNuTree->Branch("TRKendvtxVwidth",TRKendvtxVwidth,"TRKendvtxVwidth[3]/D");
01279     fAtNuTree->Branch("TRKendvtxVmean",TRKendvtxVmean,"TRKendvtxVmean[3]/D");
01280     fAtNuTree->Branch("TRKendvtxRmax",TRKendvtxRmax,"TRKendvtxRmax[3]/D");
01281     fAtNuTree->Branch("TRKendvtxQmax",TRKendvtxQmax,"TRKendvtxQmax[3]/D");
01282     fAtNuTree->Branch("TRKdir", TRKdir,"TRKdir[3]/D");
01283     fAtNuTree->Branch("TRKdirTrue", TRKdirTrue,"TRKdirTrue[3]/D");
01284     fAtNuTree->Branch("TRKdirTimeSlope", TRKdirTimeSlope,"TRKdirTimeSlope[3]/D");
01285     fAtNuTree->Branch("TRKdirTimeScatter",TRKdirTimeScatter,"TRKdirTimeScatter[3]/D");
01286     fAtNuTree->Branch("TRKbegTimeFitRms",TRKbegTimeFitRms,"TRKbegTimeFitRms[3]/D");
01287     fAtNuTree->Branch("TRKbegTimeFitNdf",TRKbegTimeFitNdf,"TRKbegTimeFitNdf[3]/I");
01288     fAtNuTree->Branch("TRKendTimeFitRms",TRKendTimeFitRms,"TRKendTimeFitRms[3]/D");
01289     fAtNuTree->Branch("TRKendTimeFitNdf",TRKendTimeFitNdf,"TRKendTimeFitNdf[3]/I");
01290     fAtNuTree->Branch("TRKbegvtxshw",TRKbegvtxshw,"TRKbegvtxshw[3]/I");
01291     fAtNuTree->Branch("TRKbegvtxshwstrips", TRKbegvtxshwstrips,"TRKbegvtxshwstrips[3]/I");
01292     fAtNuTree->Branch("TRKbegvtxshwreseeded", TRKbegvtxshwreseeded,"TRKbegvtxshwreseeded[3]/I");
01293     fAtNuTree->Branch("TRKendvtxshw",TRKendvtxshw,"TRKendvtxshw[3]/I");
01294     fAtNuTree->Branch("TRKendvtxshwstrips", TRKendvtxshwstrips,"TRKendvtxshwstrips[3]/I");
01295     fAtNuTree->Branch("TRKendvtxshwreseeded", TRKendvtxshwreseeded,"TRKendvtxshwreseeded[3]/I");
01296     fAtNuTree->Branch("TRKrange",TRKrange,"TRKrange[3]/D");
01297     fAtNuTree->Branch("TRKrangeSteel",TRKrangeSteel,"TRKrangeSteel[3]/D");
01298     fAtNuTree->Branch("TRKmomentumRange", TRKmomentumRange,"TRKmomentumRange[3]/D");
01299     fAtNuTree->Branch("TRKscore", TRKscore, "TRKscore[3]/D");
01300     fAtNuTree->Branch("TRKscoreMuEff", TRKscoreMuEff, "TRKscoreMuEff[3]/D");
01301     fAtNuTree->Branch("TRKscoreMuPur", TRKscoreMuPur, "TRKscoreMuPur[3]/D");
01302     fAtNuTree->Branch("TRKscorePiEff", TRKscorePiEff, "TRKscorePiEff[3]/D"); 
01303     fAtNuTree->Branch("TRKscorePiPur", TRKscorePiPur, "TRKscorePiPur[3]/D"); 
01304     fAtNuTree->Branch("TRKreseeded", TRKreseeded, "TRKreseeded[3]/I");
01305 
01306     fAtNuTree->Branch("Nfits",&Nfits,"Nfits/I");
01307     fAtNuTree->Branch("FITlast",&FITlast,"FITlast/I"); 
01308     fAtNuTree->Branch("FITcputime",FITcputime,"FITcputime[3]/D");
01309     fAtNuTree->Branch("FITvtxpln",FITvtxpln,"FITvtxpln[3]/I");
01310     fAtNuTree->Branch("FITbegpln",FITbegpln,"FITbegpln[3]/I");
01311     fAtNuTree->Branch("FITendpln", FITendpln,"FITendpln[3]/I");
01312     fAtNuTree->Branch("FITcharge",FITcharge,"FITcharge[3]/D");
01313     fAtNuTree->Branch("FITchisqlin", FITchisqlin, "FITchisqlin[3]/D");
01314     fAtNuTree->Branch("FITchisq", FITchisq, "FITchisq[3]/D");
01315     fAtNuTree->Branch("FITQPmean", FITQPmean, "FITQPmean[3]/D");
01316     fAtNuTree->Branch("FITQPerr", FITQPerr, "FITQPerr[3]/D");
01317     fAtNuTree->Branch("FITQPcorr", FITQPcorr, "FITQPcorr[3]/D");
01318     fAtNuTree->Branch("FITQPwidth",FITQPwidth,"FITQPwidth[3]/D");
01319     fAtNuTree->Branch("FITQPplns", FITQPplns, "FITQPplns[3]/I");
01320     fAtNuTree->Branch("FITmomentumCurve", FITmomentumCurve,"FITmomentumCurve[3]/D");
01321     fAtNuTree->Branch("FITmomentumCurveErr", FITmomentumCurveErr,"FITmomentumCurveErr[3]/D");
01322     fAtNuTree->Branch("FITpass", FITpass, "FITpass[3]/I");
01323 
01324     fAtNuTree->Branch("Nshws",&Nshws,"Nshws/I");
01325     fAtNuTree->Branch("SHWlast",&SHWlast,"SHWlast/I");
01326     fAtNuTree->Branch("SHWcputime",&SHWcputime,"SHWcputime/D");
01327     fAtNuTree->Branch("SHWplns",SHWplns,"SHWplns[3]/I");
01328     fAtNuTree->Branch("SHWstrps",SHWstrps,"SHWstrps[3]/I");
01329     fAtNuTree->Branch("SHWdigits",SHWdigits,"SHWdigits[3]/I");
01330     fAtNuTree->Branch("SHWvtxpln",SHWvtxpln,"SHWvtxpln[3]/I");
01331     fAtNuTree->Branch("SHWbegpln",SHWbegpln,"SHWbegpln[3]/I");
01332     fAtNuTree->Branch("SHWendpln",SHWendpln,"SHWendpln[3]/I");
01333     fAtNuTree->Branch("SHWtotPH",SHWtotPH,"SHWtotPH[3]/D");
01334     fAtNuTree->Branch("SHWpshwX",SHWpshwX,"SHWpshwX[3]/D");
01335     fAtNuTree->Branch("SHWpshwY",SHWpshwY,"SHWpshwY[3]/D");
01336     fAtNuTree->Branch("SHWpshwZ",SHWpshwZ,"SHWpshwZ[3]/D");
01337     fAtNuTree->Branch("SHWwidthU",SHWwidthU,"SHWwidthU[3]/D");
01338     fAtNuTree->Branch("SHWwidthV",SHWwidthV,"SHWwidthV[3]/D");
01339     fAtNuTree->Branch("SHWvtxX",SHWvtxX,"SHWvtxX[3]/D");
01340     fAtNuTree->Branch("SHWvtxY",SHWvtxY,"SHWvtxY[3]/D");
01341     fAtNuTree->Branch("SHWvtxZ",SHWvtxZ,"SHWvtxZ[3]/D");
01342     fAtNuTree->Branch("SHWdir",SHWdir,"SHWdir[3]/D");
01343     fAtNuTree->Branch("SHWdirTrue",SHWdirTrue,"SHWdirTrue[3]/D");
01344     fAtNuTree->Branch("SHWvtxshw",SHWvtxshw,"SHWvtxshw[3]/I");
01345     fAtNuTree->Branch("SHWdirTrk",SHWdirTrk,"SHWdirTrk[3]/D");
01346     fAtNuTree->Branch("SHWenergyPH",SHWenergyPH,"SHWenergyPH[3]/D");
01347     fAtNuTree->Branch("SHWenergyNstrps",SHWenergyNstrps,"SHWenergyNstrps[3]/D");
01348     fAtNuTree->Branch("SHWreseeded",SHWreseeded,"SHWreseeded[3]/I");
01349 
01350     tmpd->cd();
01351   }
01352 
01353   if(fAtNuFile){
01354     MSG("AtNuTreeModule",Msg::kDebug) << " ***** FILL TREE ***** " << endl;
01355     TDirectory* tmpd = gDirectory;   
01356     fAtNuFile->cd();
01357     fAtNuTree->Fill();
01358     tmpd->cd();
01359     MSG("AtNuTreeModule",Msg::kDebug) << " ***** TREE FILLED ***** " << endl;
01360   }  
01361 
01362   MSG("AtNuTreeModule",Msg::kInfo) << " *** AtNuTreeModule::Ana() FINISHED *** " << endl;
01363   return result;
01364 }
01365 
01366 const Registry& AtNuTreeModule::DefaultConfig() const
01367 {
01368   static Registry r;
01369   r.SetName("AtNuTreeModule.config.default");
01370   r.UnLockValues();
01371   r.Set("AtNuFileName",fAtNuFileName);
01372   r.LockValues();
01373   return r;
01374 }
01375 
01376 void AtNuTreeModule::Config(const Registry& r)
01377 {
01378   const char* tmpchar = 0;
01379 
01380   if(r.Get("AtNuFileName",tmpchar)) fAtNuFileName=tmpchar;
01381   cout << " ATNUFILENAME = " << fAtNuFileName.Data() << endl;
01382 }
01383 
01384 void AtNuTreeModule::HandleCommand(JobCommand *command)
01385 {
01386   TString cmd = command->PopCmd();
01387   if(cmd=="Set"){
01388     TString opt = command->PopOpt();
01389   }
01390 }
01391 
01392 void AtNuTreeModule::EndJob()
01393 {  
01394   if(fAtNuFile){
01395     MSG("AtNuTreeModule",Msg::kInfo) << " ***** WRITING TO FILE " << fAtNuFile->GetName() << " ***** " << endl;
01396     TDirectory* tmpd = gDirectory;
01397     fAtNuFile->cd();
01398     fAtNuTree->Write();
01399     fAtNuFile->Close();
01400     tmpd->cd();
01401     MSG("AtNuTreeModule",Msg::kInfo) << " ***** FILE CLOSED ***** " << endl;
01402   }
01403 }

Generated on Mon Feb 15 11:06:23 2010 for loon by  doxygen 1.3.9.1