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

MadAbID.cxx

Go to the documentation of this file.
00001 #include "Mad/MadAbID.h"
00002 
00003 #include "CandNtupleSR/NtpSRTrack.h"
00004 #include "CandNtupleSR/NtpSRShower.h"
00005 #include "CandNtupleSR/NtpSRStrip.h"
00006 
00007 #include "MessageService/MsgService.h"
00008 
00009 #include <cmath>
00010 
00011 ClassImp(MadAbID)
00012 
00013 CVSID("$Id: MadAbID.cxx,v 1.4 2007/06/19 21:38:04 petyt Exp $");
00014 
00015 MadAbID::MadAbID()
00016 {
00017   fCosTheta_1D = 0;
00018   fX_1D = 0;
00019   fY_1D = 0;
00020   fQ2_1D = 0;
00021   fW2_1D = 0;
00022   fCosTheta_2D = 0;
00023   fX_2D = 0;
00024   fY_2D = 1; 
00025   fQ2_2D = 0;
00026   fW2_2D = 0;
00027   fTrackPHfrac_1D = 0;
00028   fTrackPHmean_1D = 0;
00029   fTrackQPsigmaQP_1D = 0;
00030   fTrackLikePlanes_1D = 0;
00031   fTrackPHfrac_2D = 0; 
00032   fTrackPHmean_2D = 1;
00033   fTrackQPsigmaQP_2D = 1;
00034   fTrackLikePlanes_2D = 1;
00035   fTrackCharge_1D = 1; 
00036   fTrackEnergy_1D = 1;
00037   fEventEnergy_1D = 0;
00038   fNormalization = 1; 
00039 
00040   hCosTheta_1D_CC = 0;
00041   hX_1D_CC = 0;
00042   hY_1D_CC = 0;
00043   hQ2_1D_CC = 0;
00044   hW2_1D_CC = 0;
00045   hCosTheta_2D_CC = 0;
00046   hX_2D_CC = 0;
00047   hY_2D_CC = 0;
00048   hQ2_2D_CC = 0;
00049   hW2_2D_CC = 0;
00050   hE_2D_CC = 0;
00051   hTrackPHfrac_1D_CC = 0;
00052   hTrackPHmean_1D_CC = 0;
00053   hTrackQPsigmaQP_1D_CC = 0;
00054   hTrackLikePlanes_1D_CC = 0;
00055   hTrackPHfrac_2D_CC = 0;
00056   hTrackPHmean_2D_CC = 0;
00057   hTrackQPsigmaQP_2D_CC = 0;
00058   hTrackLikePlanes_2D_CC = 0;
00059   hTrackPlanes_2D_CC_1 = 0;
00060   hTrackPlanes_2D_CC_2 = 0;
00061   hTrackCharge_1D_CC = 0;
00062   hTrackEnergy_1D_CC = 0;
00063   hEventEnergy_1D_CC = 0;
00064 
00065   hCosTheta_1D_NC = 0;
00066   hX_1D_NC = 0;
00067   hY_1D_NC = 0;
00068   hQ2_1D_NC = 0;
00069   hW2_1D_NC = 0;
00070   hCosTheta_2D_NC = 0;
00071   hX_2D_NC = 0;
00072   hY_2D_NC = 0;
00073   hQ2_2D_NC = 0;
00074   hW2_2D_NC = 0;
00075   hE_2D_NC = 0;
00076   hTrackPHfrac_1D_NC = 0;
00077   hTrackPHmean_1D_NC = 0;
00078   hTrackQPsigmaQP_1D_NC = 0;
00079   hTrackLikePlanes_1D_NC = 0;
00080   hTrackPHfrac_2D_NC = 0;
00081   hTrackPHmean_2D_NC = 0;
00082   hTrackQPsigmaQP_2D_NC = 0;
00083   hTrackLikePlanes_2D_NC = 0;
00084   hTrackPlanes_2D_NC_1 = 0;
00085   hTrackPlanes_2D_NC_2 = 0;
00086   hTrackCharge_1D_NC = 0;
00087   hTrackEnergy_1D_NC = 0;
00088   hEventEnergy_1D_NC = 0;
00089 
00090   hNormalization = 0;
00091 
00092   RecoRun = -1;
00093   RecoSnarl = -1;
00094   RecoEvent = -1;
00095 
00096   PidRun = -1;
00097   PidSnarl = -1;
00098   PidEvent = -1;
00099 
00100   fReadPdfs = 0;
00101   fWritePdfs = 0;
00102   fMakePdfs = 0;
00103   fFoundPdfs = 0;
00104 
00105   fPdfsFileIn = "pdfs.in.root";
00106   fPdfsFileOut = "pdfs.out.root";
00107 
00108   fStripList = new TObjArray[500];
00109   fTrackStripList = new TObjArray[500];
00110   fTrkShowerStripList = new TObjArray[500];
00111   fShwShowerStripList = new TObjArray[500];
00112 }
00113 
00114 MadAbID::~MadAbID()
00115 {
00116   if(hCosTheta_1D_CC) delete hCosTheta_1D_CC;
00117   if(hX_1D_CC) delete hX_1D_CC;
00118   if(hY_1D_CC) delete hY_1D_CC;
00119   if(hQ2_1D_CC) delete hQ2_1D_CC;
00120   if(hW2_1D_CC) delete hW2_1D_CC;
00121   if(hCosTheta_2D_CC) delete hCosTheta_2D_CC;
00122   if(hX_2D_CC) delete hX_2D_CC;
00123   if(hY_2D_CC) delete hY_2D_CC;
00124   if(hQ2_2D_CC) delete hQ2_2D_CC;
00125   if(hW2_2D_CC) delete hW2_2D_CC;
00126   if(hE_2D_CC) delete hE_2D_CC;
00127   if(hTrackPHfrac_1D_CC) delete hTrackPHfrac_1D_CC;
00128   if(hTrackPHmean_1D_CC) delete hTrackPHmean_1D_CC;
00129   if(hTrackQPsigmaQP_1D_CC) delete hTrackQPsigmaQP_1D_CC;
00130   if(hTrackLikePlanes_1D_CC) delete hTrackLikePlanes_1D_CC;
00131   if(hTrackPHfrac_2D_CC) delete hTrackPHfrac_2D_CC;
00132   if(hTrackPHmean_2D_CC) delete hTrackPHmean_2D_CC;
00133   if(hTrackQPsigmaQP_2D_CC) delete hTrackQPsigmaQP_2D_CC;
00134   if(hTrackLikePlanes_2D_CC) delete hTrackLikePlanes_2D_CC;
00135   if(hTrackPlanes_2D_CC_1) delete hTrackPlanes_2D_CC_1;
00136   if(hTrackPlanes_2D_CC_2) delete hTrackPlanes_2D_CC_2;
00137   if(hTrackCharge_1D_CC) delete hTrackCharge_1D_CC;
00138   if(hTrackEnergy_1D_CC) delete hTrackEnergy_1D_CC;
00139   if(hEventEnergy_1D_CC) delete hEventEnergy_1D_CC;
00140 
00141   if(hCosTheta_1D_NC) delete hCosTheta_1D_NC;
00142   if(hX_1D_NC) delete hX_1D_NC;
00143   if(hY_1D_NC) delete hY_1D_NC;
00144   if(hQ2_1D_NC) delete hQ2_1D_NC;
00145   if(hW2_1D_NC) delete hW2_1D_NC;
00146   if(hCosTheta_2D_NC) delete hCosTheta_2D_NC;
00147   if(hX_2D_NC) delete hX_2D_NC;
00148   if(hY_2D_NC) delete hY_2D_NC;
00149   if(hQ2_2D_NC) delete hQ2_2D_NC;
00150   if(hW2_2D_NC) delete hW2_2D_NC;
00151   if(hE_2D_NC) delete hE_2D_NC;
00152   if(hTrackPHfrac_1D_NC) delete hTrackPHfrac_1D_NC;
00153   if(hTrackPHmean_1D_NC) delete hTrackPHmean_1D_NC;
00154   if(hTrackQPsigmaQP_1D_NC) delete hTrackQPsigmaQP_1D_NC;
00155   if(hTrackLikePlanes_1D_NC) delete hTrackLikePlanes_1D_NC;
00156   if(hTrackPHfrac_2D_NC) delete hTrackPHfrac_2D_NC;
00157   if(hTrackPHmean_2D_NC) delete hTrackPHmean_2D_NC;
00158   if(hTrackQPsigmaQP_2D_NC) delete hTrackQPsigmaQP_2D_NC;
00159   if(hTrackLikePlanes_2D_NC) delete hTrackLikePlanes_2D_NC;
00160   if(hTrackPlanes_2D_NC_1) delete hTrackPlanes_2D_NC_1;
00161   if(hTrackPlanes_2D_NC_2) delete hTrackPlanes_2D_NC_2;
00162   if(hTrackCharge_1D_NC) delete hTrackCharge_1D_NC;
00163   if(hTrackEnergy_1D_NC) delete hTrackEnergy_1D_NC;
00164   if(hEventEnergy_1D_NC) delete hEventEnergy_1D_NC;
00165 
00166   if(hNormalization) delete hNormalization;
00167 
00168   delete [] fStripList;
00169   delete [] fTrackStripList;
00170   delete [] fTrkShowerStripList;
00171   delete [] fShwShowerStripList;
00172 }
00173 
00174 Int_t MadAbID::PidCosTheta()
00175 {
00176   if( fCosTheta_1D ) return 1;
00177   else if( fCosTheta_2D ) return 2;
00178   else return 0;
00179 }
00180   
00181 Int_t MadAbID::PidX()
00182 {
00183   if( fX_1D ) return 1;
00184   else if( fX_2D ) return 2;
00185   else return 0;
00186 }
00187   
00188 Int_t MadAbID::PidY()
00189 {
00190   if( fY_1D ) return 1;
00191   else if( fY_2D ) return 2;
00192   else return 0;
00193 }
00194   
00195 Int_t MadAbID::PidW2()
00196 {
00197   if( fW2_1D ) return 1;
00198   else if( fW2_2D ) return 2;
00199   else return 0;
00200 }
00201   
00202 Int_t MadAbID::PidQ2()
00203 {
00204   if( fQ2_1D ) return 1;
00205   else if( fQ2_2D ) return 2;
00206   else return 0;
00207 }
00208   
00209 Int_t MadAbID::PidTrackPHfrac()
00210 {
00211   if( fTrackPHfrac_1D ) return 1;
00212   else if( fTrackPHfrac_2D ) return 2;
00213   else return 0;
00214 }
00215   
00216 Int_t MadAbID::PidTrackPHmean()
00217 {
00218   if( fTrackPHmean_1D ) return 1;
00219   else if( fTrackPHmean_2D ) return 2;
00220   else return 0;
00221 }
00222   
00223 Int_t MadAbID::PidTrackQPsigmaQP()
00224 {
00225   if( fTrackQPsigmaQP_1D ) return 1;
00226   else if( fTrackQPsigmaQP_2D ) return 2;
00227   else return 0;
00228 }
00229   
00230 Int_t MadAbID::PidTrackLikePlanes()
00231 {
00232   if( fTrackLikePlanes_1D ) return 1;
00233   else if( fTrackLikePlanes_2D ) return 2;
00234   else return 0;
00235 }
00236   
00237 Int_t MadAbID::PidTrackCharge()
00238 {
00239   if( fTrackCharge_1D ) return 1;
00240   else return 0;
00241 }
00242   
00243 Int_t MadAbID::PidTrackEnergy()
00244 {
00245   if( fTrackEnergy_1D ) return 1;
00246   else return 0;
00247 }
00248   
00249 Int_t MadAbID::PidEventEnergy()
00250 {
00251   if( fEventEnergy_1D ) return 1;
00252   else return 0;
00253 }
00254   
00255 Int_t MadAbID::PidNormalization()
00256 {
00257   if( fNormalization ) return 1;
00258   else return 0;
00259 }
00260 
00261 void MadAbID::UseCosTheta(Int_t n)
00262 {
00263   switch( n ){
00264     case 0: fCosTheta_1D = 0; fCosTheta_2D = 0; break;
00265     case 1: fCosTheta_1D = 1; fCosTheta_2D = 0; break;   
00266     case 2: fCosTheta_1D = 0; fCosTheta_2D = 1; break;
00267     default: fCosTheta_1D = 0; fCosTheta_2D = 1; break;
00268   }
00269 }
00270 
00271 void MadAbID::UseX(Int_t n)
00272 {
00273   switch( n ){
00274     case 0: fX_1D = 0; fX_2D = 0; break;
00275     case 1: fX_1D = 1; fX_2D = 0; break;   
00276     case 2: fX_1D = 0; fX_2D = 1; break;
00277     default: fX_1D = 0; fX_2D = 1; break;
00278   }
00279 }
00280 
00281 void MadAbID::UseY(Int_t n) 
00282 {
00283   switch( n ){
00284     case 0: fY_1D = 0; fY_2D = 0; break;
00285     case 1: fY_1D = 1; fY_2D = 0; break;   
00286     case 2: fY_1D = 0; fY_2D = 1; break;
00287     default: fY_1D = 0; fY_2D = 1; break;
00288   }
00289 }
00290     
00291 void MadAbID::UseW2(Int_t n) 
00292 {
00293   switch( n ){
00294     case 0: fQ2_1D = 0; fQ2_2D = 0; break;
00295     case 1: fQ2_1D = 1; fQ2_2D = 0; break;   
00296     case 2: fQ2_1D = 0; fQ2_2D = 1; break;
00297     default: fQ2_1D = 0; fQ2_2D = 1; break;
00298   }
00299 }
00300   
00301 void MadAbID::UseQ2(Int_t n) 
00302 {
00303   switch( n ){
00304     case 0: fW2_1D = 0; fW2_2D = 0; break;
00305     case 1: fW2_1D = 1; fW2_2D = 0; break;   
00306     case 2: fW2_1D = 0; fW2_2D = 1; break;
00307     default: fW2_1D = 0; fW2_2D = 1; break;
00308   }
00309 }
00310 
00311 void MadAbID::UseTrackPHfrac(Int_t n) 
00312 {
00313   switch( n ){
00314     case 0: fTrackPHfrac_1D = 0; fTrackPHfrac_2D = 0; break;
00315     case 1: fTrackPHfrac_1D = 1; fTrackPHfrac_2D = 0; break;   
00316     case 2: fTrackPHfrac_1D = 0; fTrackPHfrac_2D = 1; break;
00317     default: fTrackPHfrac_1D = 0; fTrackPHfrac_2D = 1; break;
00318   }
00319 }
00320     
00321 void MadAbID::UseTrackPHmean(Int_t n) 
00322 {
00323   switch( n ){
00324     case 0: fTrackPHmean_1D = 0; fTrackPHmean_2D = 0; break;
00325     case 1: fTrackPHmean_1D = 1; fTrackPHmean_2D = 0; break;   
00326     case 2: fTrackPHmean_1D = 0; fTrackPHmean_2D = 1; break;
00327     default: fTrackPHmean_1D = 0; fTrackPHmean_2D = 1; break;
00328   }
00329 }
00330   
00331 void MadAbID::UseTrackQPsigmaQP(Int_t n)
00332 { 
00333   switch( n ){
00334     case 0: fTrackQPsigmaQP_1D = 0; fTrackQPsigmaQP_2D = 0; break;
00335     case 1: fTrackQPsigmaQP_1D = 1; fTrackQPsigmaQP_2D = 0; break;   
00336     case 2: fTrackQPsigmaQP_1D = 0; fTrackQPsigmaQP_2D = 1; break;
00337     default: fTrackQPsigmaQP_1D = 0; fTrackQPsigmaQP_2D = 1; break;
00338   }
00339 }
00340 
00341 void MadAbID::UseTrackLikePlanes(Int_t n)
00342 { 
00343   switch( n ){
00344     case 0: fTrackLikePlanes_1D = 0; fTrackLikePlanes_2D = 0; break;
00345     case 1: fTrackLikePlanes_1D = 1; fTrackLikePlanes_2D = 0; break;   
00346     case 2: fTrackLikePlanes_1D = 0; fTrackLikePlanes_2D = 1; break;
00347     default: fTrackLikePlanes_1D = 0; fTrackLikePlanes_2D = 1; break;
00348   }
00349 }
00350  
00351 void MadAbID::UseTrackCharge(Int_t n)
00352 {
00353   switch( n ){
00354     case 0: fTrackCharge_1D = 0; break;
00355     case 1: fTrackCharge_1D = 1; break;
00356     default: fTrackCharge_1D = 1; break;
00357   }
00358 }
00359  
00360 void MadAbID::UseTrackEnergy(Int_t n)
00361 {
00362   switch( n ){
00363     case 0: fTrackEnergy_1D = 0; break;
00364     case 1: fTrackEnergy_1D = 1; break;
00365     default: fTrackEnergy_1D = 1; break;
00366   } 
00367 }
00368 
00369 void MadAbID::UseEventEnergy(Int_t n)
00370 {
00371   switch( n ){
00372     case 0: fEventEnergy_1D = 0; break;
00373     case 1: fEventEnergy_1D = 1; break;
00374     default: fEventEnergy_1D = 1; break;
00375   }
00376 }
00377  
00378 void MadAbID::UseNormalization(Int_t n)
00379 {
00380   switch( n ){
00381     case 0: fNormalization = 0; break;
00382     case 1: fNormalization = 1; break;
00383     default: fNormalization = 1; break;
00384   }
00385 }
00386 
00387 void MadAbID::Reset()
00388 {
00389   fCosTheta_1D = 0;
00390   fX_1D = 0;
00391   fY_1D = 0;
00392   fQ2_1D = 0;
00393   fW2_1D = 0;
00394   fCosTheta_2D = 0;
00395   fX_2D = 0;
00396   fY_2D = 0;
00397   fQ2_2D = 0;
00398   fW2_2D = 0;
00399   fTrackPHfrac_1D = 0;
00400   fTrackPHmean_1D = 0;
00401   fTrackQPsigmaQP_1D = 0;
00402   fTrackLikePlanes_1D = 0;
00403   fTrackPHfrac_2D = 0;
00404   fTrackPHmean_2D = 0;
00405   fTrackQPsigmaQP_2D = 0;
00406   fTrackLikePlanes_2D = 0;
00407   fTrackCharge_1D = 0;
00408   fTrackEnergy_1D = 0;
00409   fEventEnergy_1D = 0;
00410   fNormalization = 0;
00411 }
00412 
00413 Bool_t MadAbID::PassCuts(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00414 {
00415   MSG("MadAb",Msg::kDebug) << " *** MadAbID::PassCuts(...) *** " << endl;
00416 
00417   // calculate Reco variables
00418   // ========================
00419   this->MakeRecoVariables(ntpEvent,ntpRecord);
00420 
00421   // Selection Cuts
00422   // ==============
00423   // reconstructed track
00424   // track passes kalman fitter // DP 14/05 - removed this condition
00425   // track has contained vertex
00426 
00427   Bool_t passfail = 0;
00428 
00429   MSG("MadAb",Msg::kVerbose) << "  Pass/Fail Conditions: " << endl
00430     << "  Track Planes = " << TRKplanes << endl
00431     << "  Track Fit Pass/Fail = " << TRKFITpass << endl
00432     << "  Track Vertex Containment = " << RECOvtxcontained << endl;
00433 
00434   if( TRKplanes>0 
00435       //  && TRKFITpass==1  // DP 14/05 - removed this condition
00436    && RECOvtxcontained ){
00437     passfail = 1;
00438   }
00439   
00440   MSG("MadAb",Msg::kVerbose) << "  Pass/Fail = " << passfail << endl;
00441 
00442   return passfail;
00443 }
00444 
00445 Double_t MadAbID::GetRecoCosTheta(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00446 {
00447   // calculate Reco variables
00448   // ========================
00449   this->MakeRecoVariables(ntpEvent,ntpRecord);
00450 
00451   return RECOdircosneu;
00452 }
00453 
00454 Double_t MadAbID::GetRecoX(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00455 {
00456   // calculate Reco variables
00457   // ========================
00458   this->MakeRecoVariables(ntpEvent,ntpRecord);
00459 
00460   return RECOx;
00461 }
00462 
00463 Double_t MadAbID::GetRecoY(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00464 {
00465   // calculate Reco variables
00466   // ========================
00467   this->MakeRecoVariables(ntpEvent,ntpRecord);
00468 
00469   return RECOy;
00470 }
00471   
00472 Double_t MadAbID::GetRecoQ2(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00473 {
00474   // calculate Reco variables
00475   // ========================
00476   this->MakeRecoVariables(ntpEvent,ntpRecord);
00477 
00478   return RECOq2;
00479 }
00480   
00481 Double_t MadAbID::GetRecoW2(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00482 {
00483   // calculate Reco variables
00484   // ========================
00485   this->MakeRecoVariables(ntpEvent,ntpRecord);
00486 
00487   return RECOw2;
00488 }
00489   
00490 Double_t MadAbID::GetRecoE(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00491 {
00492   // calculate Reco variables
00493   // ========================
00494   this->MakeRecoVariables(ntpEvent,ntpRecord);
00495 
00496   return RECOenu;
00497 }
00498 
00499 Int_t MadAbID::GetTrackPlanes(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00500 {
00501   // calculate Reco variables
00502   // ========================
00503   this->MakeRecoVariables(ntpEvent,ntpRecord);
00504 
00505   return TRKspanplanes;
00506 }
00507   
00508 Int_t MadAbID::GetTrackLikePlanes(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00509 {
00510   // calculate Reco variables
00511   // ========================
00512   this->MakeRecoVariables(ntpEvent,ntpRecord);
00513 
00514   return TRKtrackplanes;
00515 }
00516   
00517 Int_t MadAbID::GetTrackEMCharge(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00518 {
00519   // calculate Reco variables
00520   // ========================
00521   this->MakeRecoVariables(ntpEvent,ntpRecord);
00522 
00523   return TRKFITemcharge;
00524 }
00525   
00526 Double_t MadAbID::GetTrackQPsigmaQP(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00527 {
00528   // calculate Reco variables
00529   // ========================
00530   this->MakeRecoVariables(ntpEvent,ntpRecord);
00531 
00532   return fabs(TRKFITqpsigmaqp);
00533 }
00534   
00535 Double_t MadAbID::GetTrackPHfrac(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00536 {
00537   // calculate Reco variables
00538   // ========================
00539   this->MakeRecoVariables(ntpEvent,ntpRecord);
00540 
00541   Double_t reco_phfrac = -999.9;
00542   if( RECOtotph>0.0 ) reco_phfrac = TRKtotph/RECOtotph;
00543   
00544   return reco_phfrac;
00545 }
00546   
00547 Double_t MadAbID::GetTrackPHmean(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00548 {
00549   // calculate Reco variables
00550   // ========================
00551   this->MakeRecoVariables(ntpEvent,ntpRecord);
00552 
00553   Double_t reco_phmean = -999.9;
00554   if( TRKtrackplanes>2 ) reco_phmean = TRKtrkph/TRKtrackplanes;
00555   else if(TRKplanes>0 ) reco_phmean = TRKtotph/TRKplanes;
00556   
00557   return reco_phmean;
00558 }
00559 
00560 Double_t MadAbID::CalcPID(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00561 {
00562   return this->GetPid(ntpEvent,ntpRecord);
00563 }
00564 
00565 Bool_t MadAbID::GetPass(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00566 {
00567   // calculate PID variables
00568   // =======================
00569   this->MakePidVariables(ntpEvent,ntpRecord);
00570 
00571   return PIDPASSFAIL;
00572 }
00573 
00574 Double_t MadAbID::GetPid(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00575 {
00576   // calculate PID variables
00577   // =======================
00578   this->MakePidVariables(ntpEvent,ntpRecord);
00579 
00580   return PID;
00581 }
00582 
00583 Double_t MadAbID::GetProbCC(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00584 {
00585   // calculate PID variables
00586   // =======================
00587   this->MakePidVariables(ntpEvent,ntpRecord);
00588 
00589   return PROBCC;
00590 }
00591 
00592 Double_t MadAbID::GetProbNC(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
00593 {
00594   // calculate PID variables
00595   // =======================
00596   this->MakePidVariables(ntpEvent,ntpRecord);
00597 
00598   return PROBNC;
00599 }
00600 
00601 void MadAbID::ReadPDFs(const char* filename)
00602 {
00603   MSG("MadAb",Msg::kDebug) << " *** MadAbID::ReadPDFs(...) *** " << endl;
00604 
00605   fPdfsFileIn = filename;
00606   fReadPdfs = 1;
00607 
00608   if( fReadPdfs ){
00609 
00610     // Delete old PDFs
00611     // ===============
00612     if(hCosTheta_1D_CC) delete hCosTheta_1D_CC;
00613     if(hX_1D_CC) delete hX_1D_CC;
00614     if(hY_1D_CC) delete hY_1D_CC;
00615     if(hQ2_1D_CC) delete hQ2_1D_CC;
00616     if(hW2_1D_CC) delete hW2_1D_CC;
00617     if(hCosTheta_2D_CC) delete hCosTheta_2D_CC;
00618     if(hX_2D_CC) delete hX_2D_CC;
00619     if(hY_2D_CC) delete hY_2D_CC;
00620     if(hQ2_2D_CC) delete hQ2_2D_CC;
00621     if(hW2_2D_CC) delete hW2_2D_CC;
00622     if(hE_2D_CC) delete hE_2D_CC;
00623     if(hTrackPHfrac_1D_CC) delete hTrackPHfrac_1D_CC;
00624     if(hTrackPHmean_1D_CC) delete hTrackPHmean_1D_CC;
00625     if(hTrackQPsigmaQP_1D_CC) delete hTrackQPsigmaQP_1D_CC;
00626     if(hTrackLikePlanes_1D_CC) delete hTrackLikePlanes_1D_CC;
00627     if(hTrackPHfrac_2D_CC) delete hTrackPHfrac_2D_CC;
00628     if(hTrackPHmean_2D_CC) delete hTrackPHmean_2D_CC;
00629     if(hTrackQPsigmaQP_2D_CC) delete hTrackQPsigmaQP_2D_CC;
00630     if(hTrackLikePlanes_2D_CC) delete hTrackLikePlanes_2D_CC;
00631     if(hTrackPlanes_2D_CC_1) delete hTrackPlanes_2D_CC_1;
00632     if(hTrackPlanes_2D_CC_2) delete hTrackPlanes_2D_CC_2;
00633     if(hTrackCharge_1D_CC) delete hTrackCharge_1D_CC;
00634     if(hTrackEnergy_1D_CC) delete hTrackEnergy_1D_CC;
00635     if(hEventEnergy_1D_CC) delete hEventEnergy_1D_CC;
00636 
00637     if(hCosTheta_1D_NC) delete hCosTheta_1D_NC;
00638     if(hX_1D_NC) delete hX_1D_NC;
00639     if(hY_1D_NC) delete hY_1D_NC;
00640     if(hQ2_1D_NC) delete hQ2_1D_NC;
00641     if(hW2_1D_NC) delete hW2_1D_NC;
00642     if(hCosTheta_2D_NC) delete hCosTheta_2D_NC;
00643     if(hX_2D_NC) delete hX_2D_NC;
00644     if(hY_2D_NC) delete hY_2D_NC;
00645     if(hQ2_2D_NC) delete hQ2_2D_NC;
00646     if(hW2_2D_NC) delete hW2_2D_NC;
00647     if(hE_2D_NC) delete hE_2D_NC;
00648     if(hTrackPHfrac_1D_NC) delete hTrackPHfrac_1D_NC;
00649     if(hTrackPHmean_1D_NC) delete hTrackPHmean_1D_NC;
00650     if(hTrackQPsigmaQP_1D_NC) delete hTrackQPsigmaQP_1D_NC;
00651     if(hTrackLikePlanes_1D_NC) delete hTrackLikePlanes_1D_NC;
00652     if(hTrackPHfrac_2D_NC) delete hTrackPHfrac_2D_NC;
00653     if(hTrackPHmean_2D_NC) delete hTrackPHmean_2D_NC;
00654     if(hTrackQPsigmaQP_2D_NC) delete hTrackQPsigmaQP_2D_NC;
00655     if(hTrackLikePlanes_2D_NC) delete hTrackLikePlanes_2D_NC;
00656     if(hTrackPlanes_2D_NC_1) delete hTrackPlanes_2D_NC_1;
00657     if(hTrackPlanes_2D_NC_2) delete hTrackPlanes_2D_NC_2;
00658     if(hTrackCharge_1D_NC) delete hTrackCharge_1D_NC;
00659     if(hTrackEnergy_1D_NC) delete hTrackEnergy_1D_NC;
00660     if(hEventEnergy_1D_NC) delete hEventEnergy_1D_NC;
00661 
00662     if(hNormalization) delete hNormalization;
00663 
00664     fFoundPdfs = 0;
00665 
00666     // Read PDFs from file
00667     // ===================
00668     MSG("MadAb",Msg::kInfo) << "  reading PDFs from file " << endl;
00669 
00670     TDirectory* tmpd = 0;
00671     tmpd = gDirectory;
00672     TFile* file = new TFile(fPdfsFileIn.Data(),"read");
00673 
00674     if( file->IsOpen() ){
00675       hCosTheta_1D_CC = (TH1D*)(file->Get("hCosTheta_1D_CC"));
00676       hX_1D_CC = (TH1D*)(file->Get("hX_1D_CC"));
00677       hY_1D_CC = (TH1D*)(file->Get("hY_1D_CC"));
00678       hQ2_1D_CC = (TH1D*)(file->Get("hQ2_1D_CC"));
00679       hW2_1D_CC = (TH1D*)(file->Get("hW2_1D_CC"));
00680       hCosTheta_2D_CC = (TH2D*)(file->Get("hCosTheta_2D_CC"));
00681       hX_2D_CC = (TH2D*)(file->Get("hX_2D_CC"));
00682       hY_2D_CC = (TH2D*)(file->Get("hY_2D_CC"));
00683       hQ2_2D_CC = (TH2D*)(file->Get("hQ2_2D_CC"));
00684       hW2_2D_CC = (TH2D*)(file->Get("hW2_2D_CC"));
00685       hE_2D_CC = (TH1D*)(file->Get("hE_2D_CC"));
00686       hTrackPHfrac_1D_CC = (TH1D*)(file->Get("hTrackPHfrac_1D_CC"));
00687       hTrackPHmean_1D_CC = (TH1D*)(file->Get("hTrackPHmean_1D_CC"));
00688       hTrackQPsigmaQP_1D_CC = (TH1D*)(file->Get("hTrackQPsigmaQP_1D_CC"));
00689       hTrackLikePlanes_1D_CC = (TH1D*)(file->Get("hTrackLikePlanes_1D_CC"));
00690       hTrackPHfrac_2D_CC = (TH2D*)(file->Get("hTrackPHfrac_2D_CC"));
00691       hTrackPHmean_2D_CC = (TH2D*)(file->Get("hTrackPHmean_2D_CC"));
00692       hTrackQPsigmaQP_2D_CC = (TH2D*)(file->Get("hTrackQPsigmaQP_2D_CC"));
00693       hTrackLikePlanes_2D_CC = (TH2D*)(file->Get("hTrackLikePlanes_2D_CC"));
00694       hTrackPlanes_2D_CC_1 = (TH1D*)(file->Get("hTrackPlanes_2D_CC_1"));
00695       hTrackPlanes_2D_CC_2 = (TH1D*)(file->Get("hTrackPlanes_2D_CC_2"));
00696       hTrackCharge_1D_CC = (TH1D*)(file->Get("hTrackCharge_1D_CC"));
00697       hTrackEnergy_1D_CC = (TH1D*)(file->Get("hTrackEnergy_1D_CC"));
00698       hEventEnergy_1D_CC = (TH1D*)(file->Get("hEventEnergy_1D_CC"));
00699       hCosTheta_1D_NC = (TH1D*)(file->Get("hCosTheta_1D_NC"));
00700       hX_1D_NC = (TH1D*)(file->Get("hX_1D_NC"));
00701       hY_1D_NC = (TH1D*)(file->Get("hY_1D_NC"));
00702       hQ2_1D_NC = (TH1D*)(file->Get("hQ2_1D_NC"));
00703       hW2_1D_NC = (TH1D*)(file->Get("hW2_1D_NC"));
00704       hCosTheta_2D_NC = (TH2D*)(file->Get("hCosTheta_2D_NC"));
00705       hX_2D_NC = (TH2D*)(file->Get("hX_2D_NC"));
00706       hY_2D_NC = (TH2D*)(file->Get("hY_2D_NC"));
00707       hQ2_2D_NC = (TH2D*)(file->Get("hQ2_2D_NC"));
00708       hW2_2D_NC = (TH2D*)(file->Get("hW2_2D_NC"));
00709       hE_2D_NC = (TH1D*)(file->Get("hE_2D_NC"));
00710       hTrackPHfrac_1D_NC = (TH1D*)(file->Get("hTrackPHfrac_1D_NC"));
00711       hTrackPHmean_1D_NC = (TH1D*)(file->Get("hTrackPHmean_1D_NC"));
00712       hTrackQPsigmaQP_1D_NC = (TH1D*)(file->Get("hTrackQPsigmaQP_1D_NC"));
00713       hTrackLikePlanes_1D_NC = (TH1D*)(file->Get("hTrackLikePlanes_1D_NC"));
00714       hTrackPHfrac_2D_NC = (TH2D*)(file->Get("hTrackPHfrac_2D_NC"));
00715       hTrackPHmean_2D_NC = (TH2D*)(file->Get("hTrackPHmean_2D_NC"));
00716       hTrackQPsigmaQP_2D_NC = (TH2D*)(file->Get("hTrackQPsigmaQP_2D_NC"));
00717       hTrackLikePlanes_2D_NC = (TH2D*)(file->Get("hTrackLikePlanes_2D_NC"));
00718       hTrackPlanes_2D_NC_1 = (TH1D*)(file->Get("hTrackPlanes_2D_NC_1"));
00719       hTrackPlanes_2D_NC_2 = (TH1D*)(file->Get("hTrackPlanes_2D_NC_2"));
00720       hTrackCharge_1D_NC = (TH1D*)(file->Get("hTrackCharge_1D_NC"));
00721       hTrackEnergy_1D_NC = (TH1D*)(file->Get("hTrackEnergy_1D_NC"));
00722       hEventEnergy_1D_NC = (TH1D*)(file->Get("hEventEnergy_1D_NC"));
00723       hNormalization = (TH1D*)(file->Get("hNormalization"));
00724     }
00725     else{
00726       MSG("MadAb",Msg::kWarning) << "   ... unable to open file: " << fPdfsFileIn.Data() << endl;
00727     }
00728 
00729     gDirectory = tmpd;
00730 
00731     if( hCosTheta_1D_CC
00732      && hX_1D_CC
00733      && hY_1D_CC
00734      && hQ2_1D_CC
00735      && hW2_1D_CC
00736      && hCosTheta_2D_CC
00737      && hX_2D_CC
00738      && hY_2D_CC
00739      && hQ2_2D_CC
00740      && hW2_2D_CC
00741      && hE_2D_CC
00742      && hTrackPHfrac_1D_CC
00743      && hTrackPHmean_1D_CC
00744      && hTrackQPsigmaQP_1D_CC
00745      && hTrackLikePlanes_1D_CC
00746      && hTrackPHfrac_2D_CC
00747      && hTrackPHmean_2D_CC
00748      && hTrackQPsigmaQP_2D_CC
00749      && hTrackLikePlanes_2D_CC
00750      && hTrackPlanes_2D_CC_1
00751      && hTrackPlanes_2D_CC_2
00752      && hTrackCharge_1D_CC
00753      && hTrackEnergy_1D_CC
00754      && hEventEnergy_1D_CC
00755      && hCosTheta_1D_NC
00756      && hX_1D_NC
00757      && hY_1D_NC
00758      && hQ2_1D_NC
00759      && hW2_1D_NC
00760      && hCosTheta_2D_NC
00761      && hX_2D_NC
00762      && hY_2D_NC
00763      && hQ2_2D_NC
00764      && hW2_2D_NC
00765      && hE_2D_NC
00766      && hTrackPHfrac_1D_NC
00767      && hTrackPHmean_1D_NC
00768      && hTrackQPsigmaQP_1D_NC
00769      && hTrackLikePlanes_1D_NC
00770      && hTrackPHfrac_2D_NC
00771      && hTrackPHmean_2D_NC
00772      && hTrackQPsigmaQP_2D_NC
00773      && hTrackLikePlanes_2D_NC
00774      && hTrackPlanes_2D_NC_1
00775      && hTrackPlanes_2D_NC_2
00776      && hTrackCharge_1D_NC
00777      && hTrackEnergy_1D_NC
00778      && hEventEnergy_1D_NC 
00779      && hNormalization ){
00780       MSG("MadAb",Msg::kInfo) << "   ... found PDFs from file " << endl;
00781       fFoundPdfs = 1;
00782     }
00783   }
00784 }
00785 
00786 void MadAbID::WritePDFs(const char* filename)
00787 {
00788   MSG("MadAb",Msg::kDebug) << " *** MadAbID::WritePDFs(...) *** " << endl;
00789 
00790   fPdfsFileOut = filename;
00791   fWritePdfs = 1;
00792 
00793   // Write PDFs to file
00794   // ==================
00795   if( fWritePdfs ){
00796     
00797     //DP    TDirectory* tmpd = 0;
00798     //DP    tmpd = gDirectory;
00799     TFile* file = new TFile(fPdfsFileOut.Data(),"recreate");
00800   
00801 
00802     /* DP
00803     hCosTheta_1D_CC->SetDirectory(file);
00804     hX_1D_CC->SetDirectory(file);
00805     hY_1D_CC->SetDirectory(file);
00806     hQ2_1D_CC->SetDirectory(file);
00807     hW2_1D_CC->SetDirectory(file); 
00808     hCosTheta_2D_CC->SetDirectory(file); 
00809     hX_2D_CC->SetDirectory(file);
00810     hY_2D_CC->SetDirectory(file);
00811     hQ2_2D_CC->SetDirectory(file);
00812     hW2_2D_CC->SetDirectory(file);
00813     hE_2D_CC->SetDirectory(file);
00814     hTrackPHfrac_1D_CC->SetDirectory(file);
00815     hTrackPHmean_1D_CC->SetDirectory(file);
00816     hTrackQPsigmaQP_1D_CC->SetDirectory(file);
00817     hTrackLikePlanes_1D_CC->SetDirectory(file);
00818     hTrackPHfrac_2D_CC->SetDirectory(file);
00819     hTrackPHmean_2D_CC->SetDirectory(file);
00820     hTrackQPsigmaQP_2D_CC->SetDirectory(file);
00821     hTrackLikePlanes_2D_CC->SetDirectory(file);
00822     hTrackPlanes_2D_CC_1->SetDirectory(file);
00823     hTrackPlanes_2D_CC_2->SetDirectory(file);
00824     hTrackCharge_1D_CC->SetDirectory(file);
00825     hTrackEnergy_1D_CC->SetDirectory(file);
00826     hEventEnergy_1D_CC->SetDirectory(file);
00827 
00828     hCosTheta_1D_NC->SetDirectory(file);
00829     hX_1D_NC->SetDirectory(file);
00830     hY_1D_NC->SetDirectory(file);
00831     hQ2_1D_NC->SetDirectory(file);
00832     hW2_1D_NC->SetDirectory(file);
00833     hCosTheta_2D_NC->SetDirectory(file);
00834     hX_2D_NC->SetDirectory(file);
00835     hY_2D_NC->SetDirectory(file);
00836     hQ2_2D_NC->SetDirectory(file);
00837     hW2_2D_NC->SetDirectory(file);
00838     hE_2D_NC->SetDirectory(file);
00839     hTrackPHfrac_1D_NC->SetDirectory(file);
00840     hTrackPHmean_1D_NC->SetDirectory(file);
00841     hTrackQPsigmaQP_1D_NC->SetDirectory(file);
00842     hTrackLikePlanes_1D_NC->SetDirectory(file);
00843     hTrackPHfrac_2D_NC->SetDirectory(file);
00844     hTrackPHmean_2D_NC->SetDirectory(file);
00845     hTrackQPsigmaQP_2D_NC->SetDirectory(file);
00846     hTrackLikePlanes_2D_NC->SetDirectory(file);
00847     hTrackPlanes_2D_NC_1->SetDirectory(file);
00848     hTrackPlanes_2D_NC_2->SetDirectory(file);
00849     hTrackCharge_1D_NC->SetDirectory(file);
00850     hTrackEnergy_1D_NC->SetDirectory(file);
00851     hEventEnergy_1D_NC->SetDirectory(file);
00852 
00853     hNormalization->SetDirectory(file);
00854     */ //DP
00855       
00856       
00857     // DP added 
00858     file->cd();
00859     hCosTheta_1D_CC->Write();
00860     hX_1D_CC->Write();
00861     hY_1D_CC->Write();
00862     hQ2_1D_CC->Write();
00863     hW2_1D_CC->Write(); 
00864     hCosTheta_2D_CC->Write(); 
00865     hX_2D_CC->Write();
00866     hY_2D_CC->Write();
00867     hQ2_2D_CC->Write();
00868     hW2_2D_CC->Write();
00869     hE_2D_CC->Write();
00870     hTrackPHfrac_1D_CC->Write();
00871     hTrackPHmean_1D_CC->Write();
00872     hTrackQPsigmaQP_1D_CC->Write();
00873     hTrackLikePlanes_1D_CC->Write();
00874     hTrackPHfrac_2D_CC->Write();
00875     hTrackPHmean_2D_CC->Write();
00876     hTrackQPsigmaQP_2D_CC->Write();
00877     hTrackLikePlanes_2D_CC->Write();
00878     hTrackPlanes_2D_CC_1->Write();
00879     hTrackPlanes_2D_CC_2->Write();
00880     hTrackCharge_1D_CC->Write();
00881     hTrackEnergy_1D_CC->Write();
00882     hEventEnergy_1D_CC->Write();
00883 
00884     hCosTheta_1D_NC->Write();
00885     hX_1D_NC->Write();
00886     hY_1D_NC->Write();
00887     hQ2_1D_NC->Write();
00888     hW2_1D_NC->Write();
00889     hCosTheta_2D_NC->Write();
00890     hX_2D_NC->Write();
00891     hY_2D_NC->Write();
00892     hQ2_2D_NC->Write();
00893     hW2_2D_NC->Write();
00894     hE_2D_NC->Write();
00895     hTrackPHfrac_1D_NC->Write();
00896     hTrackPHmean_1D_NC->Write();
00897     hTrackQPsigmaQP_1D_NC->Write();
00898     hTrackLikePlanes_1D_NC->Write();
00899     hTrackPHfrac_2D_NC->Write();
00900     hTrackPHmean_2D_NC->Write();
00901     hTrackQPsigmaQP_2D_NC->Write();
00902     hTrackLikePlanes_2D_NC->Write();
00903     hTrackPlanes_2D_NC_1->Write();
00904     hTrackPlanes_2D_NC_2->Write();
00905     hTrackCharge_1D_NC->Write();
00906     hTrackEnergy_1D_NC->Write();
00907     hEventEnergy_1D_NC->Write();
00908 
00909     hNormalization->Write();
00910 
00911     //DP file->Write();
00912 
00913     file->Close();
00914 
00915     //DP    gDirectory = tmpd;
00916 
00917   }
00918 }
00919 
00920 void MadAbID::NormalizePDFs()
00921 {
00922   MSG("MadAb",Msg::kDebug) << " *** MadAbID::NormalizePDFs() *** " << endl;
00923 
00924   if( fFoundPdfs ){
00925     MSG("MadAb",Msg::kDebug) << " OVERALL NORMALIZATION: CC=" << hNormalization->GetBinContent(hNormalization->FindBin(1)) << " NC=" << hNormalization->GetBinContent(hNormalization->FindBin(0)) << endl;
00926 
00927     MSG("MadAb",Msg::kDebug) << endl
00928       << "  normalizing histograms [before]: " << endl
00929       << "   hCosTheta_1D_CC: " << hCosTheta_1D_CC->Integral("width") << endl
00930       << "   hX_1D_CC: " << hX_1D_CC->Integral("width") << endl
00931       << "   hY_1D_CC: " << hY_1D_CC->Integral("width") << endl
00932       << "   hQ2_1D_CC: " << hQ2_1D_CC->Integral("width") << endl
00933       << "   hW2_1D_CC: " << hW2_1D_CC->Integral("width") << endl
00934       << "   hCosTheta_2D_CC: " << hCosTheta_2D_CC->Integral("width") << endl
00935       << "   hX_2D_CC: " << hX_2D_CC->Integral("width") << endl
00936       << "   hY_2D_CC: " << hY_2D_CC->Integral("width") << endl
00937       << "   hQ2_2D_CC: " << hQ2_2D_CC->Integral("width") << endl
00938       << "   hW2_2D_CC: " << hW2_2D_CC->Integral("width") << endl
00939       << "   hE_2D_CC: " << hE_2D_CC->Integral("width") << endl
00940       << "   hTrackPHfrac_1D_CC: " << hTrackPHfrac_1D_CC->Integral("width") << endl
00941       << "   hTrackPHmean_1D_CC: " << hTrackPHmean_1D_CC->Integral("width") << endl
00942       << "   hTrackQPsigmaQP_1D_CC: " << hTrackQPsigmaQP_1D_CC->Integral("width") << endl
00943       << "   hTrackLikePlanes1D_CC: " << hTrackLikePlanes_1D_CC->Integral("width") << endl
00944       << "   hTrackPHfrac_2D_CC: " << hTrackPHfrac_2D_CC->Integral("width") << endl
00945       << "   hTrackPHmean_2D_CC: " << hTrackPHmean_2D_CC->Integral("width") << endl
00946       << "   hTrackQPsigmaQP_2D_CC: " << hTrackQPsigmaQP_2D_CC->Integral("width") << endl
00947       << "   hTrackLikePlanes_2D_CC: " << hTrackLikePlanes_2D_CC->Integral("width") << endl
00948       << "   hTrackPlanes_2D_CC_1: " << hTrackPlanes_2D_CC_1->Integral("width") << endl
00949       << "   hTrackPlanes_2D_CC_2: " << hTrackPlanes_2D_CC_2->Integral("width") << endl
00950       << "   hTrackCharge_1D_CC: " << hTrackCharge_1D_CC->Integral("width") << endl
00951       << "   hTrackEnergy_1D_CC: " << hTrackEnergy_1D_CC->Integral("width") << endl
00952       << "   hEventEnergy_1D_CC: " << hEventEnergy_1D_CC->Integral("width") << endl
00953       << "   hCosTheta_1D_NC: " << hCosTheta_1D_NC->Integral("width") << endl
00954       << "   hX_1D_NC: " << hX_1D_NC->Integral("width") << endl
00955       << "   hY_1D_NC: " << hY_1D_NC->Integral("width") << endl
00956       << "   hQ2_1D_NC: " << hQ2_1D_NC->Integral("width") << endl
00957       << "   hW2_1D_NC: " << hW2_1D_NC->Integral("width") << endl
00958       << "   hCosTheta_2D_NC: " << hCosTheta_2D_NC->Integral("width") << endl
00959       << "   hX_2D_NC: " << hX_2D_NC->Integral("width") << endl
00960       << "   hY_2D_NC: " << hY_2D_NC->Integral("width") << endl
00961       << "   hQ2_2D_NC: " << hQ2_2D_NC->Integral("width") << endl
00962       << "   hW2_2D_NC: " << hW2_2D_NC->Integral("width") << endl
00963       << "   hE_2D_NC: " << hE_2D_NC->Integral("width") << endl
00964       << "   hTrackPHfrac_1D_NC: " << hTrackPHfrac_1D_NC->Integral("width") << endl
00965       << "   hTrackPHmean_1D_NC: " << hTrackPHmean_1D_NC->Integral("width") << endl
00966       << "   hTrackQPsigmaQP_1D_NC: " << hTrackQPsigmaQP_1D_NC->Integral("width") << endl
00967       << "   hTrackLikePlanes_1D_NC: " << hTrackLikePlanes_1D_NC->Integral("width") << endl
00968       << "   hTrackPHfrac_2D_NC: " << hTrackPHfrac_2D_NC->Integral("width") << endl
00969       << "   hTrackPHmean_2D_NC: " << hTrackPHmean_2D_NC->Integral("width") << endl
00970       << "   hTrackQPsigmaQP_2D_NC: " << hTrackQPsigmaQP_2D_NC->Integral("width") << endl
00971       << "   hTrackLikePlanes_2D_NC: " << hTrackLikePlanes_2D_NC->Integral("width") << endl
00972       << "   hTrackPlanes_2D_NC_1: " << hTrackPlanes_2D_NC_1->Integral("width") << endl
00973       << "   hTrackPlanes_2D_NC_2: " << hTrackPlanes_2D_NC_2->Integral("width") << endl
00974       << "   hTrackCharge_1D_NC: " << hTrackCharge_1D_NC->Integral("width") << endl
00975       << "   hTrackEnergy_1D_NC: " << hTrackEnergy_1D_NC->Integral("width") << endl
00976       << "   hEventEnergy_1D_NC: " << hEventEnergy_1D_NC->Integral("width") << endl
00977       << "   hNormalization: " << hNormalization->Integral("width") << endl;
00978 
00979     if(hCosTheta_1D_CC->Integral("width")>0.0) hCosTheta_1D_CC->Scale(1.0/hCosTheta_1D_CC->Integral("width"));
00980     if(hX_1D_CC->Integral("width")>0.0) hX_1D_CC->Scale(1.0/hX_1D_CC->Integral("width"));
00981     if(hY_1D_CC->Integral("width")>0.0) hY_1D_CC->Scale(1.0/hY_1D_CC->Integral("width"));
00982     if(hQ2_1D_CC->Integral("width")>0.0) hQ2_1D_CC->Scale(1.0/hQ2_1D_CC->Integral("width"));
00983     if(hW2_1D_CC->Integral("width")>0.0) hW2_1D_CC->Scale(1.0/hW2_1D_CC->Integral("width"));
00984     if(hCosTheta_2D_CC->Integral("width")>0.0) hCosTheta_2D_CC->Scale(1.0/hCosTheta_2D_CC->Integral("width"));
00985     if(hX_2D_CC->Integral("width")>0.0) hX_2D_CC->Scale(1.0/hX_2D_CC->Integral("width"));
00986     if(hY_2D_CC->Integral("width")>0.0) hY_2D_CC->Scale(1.0/hY_2D_CC->Integral("width"));
00987     if(hQ2_2D_CC->Integral("width")>0.0) hQ2_2D_CC->Scale(1.0/hQ2_2D_CC->Integral("width"));
00988     if(hW2_2D_CC->Integral("width")>0.0) hW2_2D_CC->Scale(1.0/hW2_2D_CC->Integral("width"));
00989     if(hE_2D_CC->Integral("width")>0.0) hE_2D_CC->Scale(1.0/hE_2D_CC->Integral("width"));
00990     if(hTrackPHfrac_1D_CC->Integral("width")>0.0) hTrackPHfrac_1D_CC->Scale(1.0/hTrackPHfrac_1D_CC->Integral("width"));
00991     if(hTrackPHmean_1D_CC->Integral("width")>0.0) hTrackPHmean_1D_CC->Scale(1.0/hTrackPHmean_1D_CC->Integral("width"));
00992     if(hTrackQPsigmaQP_1D_CC->Integral("width")>0.0) hTrackQPsigmaQP_1D_CC->Scale(1.0/hTrackQPsigmaQP_1D_CC->Integral("width"));
00993     if(hTrackLikePlanes_1D_CC->Integral("width")>0.0) hTrackLikePlanes_1D_CC->Scale(1.0/hTrackLikePlanes_1D_CC->Integral("width"));
00994     if(hTrackPHfrac_2D_CC->Integral("width")>0.0) hTrackPHfrac_2D_CC->Scale(1.0/hTrackPHfrac_2D_CC->Integral("width"));
00995     if(hTrackPHmean_2D_CC->Integral("width")>0.0) hTrackPHmean_2D_CC->Scale(1.0/hTrackPHmean_2D_CC->Integral("width"));
00996     if(hTrackQPsigmaQP_2D_CC->Integral("width")>0.0) hTrackQPsigmaQP_2D_CC->Scale(1.0/hTrackQPsigmaQP_2D_CC->Integral("width"));
00997     if(hTrackLikePlanes_2D_CC->Integral("width")>0.0) hTrackLikePlanes_2D_CC->Scale(1.0/hTrackLikePlanes_2D_CC->Integral("width"));
00998     if(hTrackPlanes_2D_CC_1->Integral("width")>0.0) hTrackPlanes_2D_CC_1->Scale(1.0/hTrackPlanes_2D_CC_1->Integral("width"));
00999     if(hTrackPlanes_2D_CC_2->Integral("width")>0.0) hTrackPlanes_2D_CC_2->Scale(1.0/hTrackPlanes_2D_CC_2->Integral("width"));
01000     if(hTrackCharge_1D_CC->Integral("width")>0.0) hTrackCharge_1D_CC->Scale(1.0/hTrackCharge_1D_CC->Integral("width"));
01001     if(hTrackEnergy_1D_CC->Integral("width")>0.0) hTrackEnergy_1D_CC->Scale(1.0/hTrackEnergy_1D_CC->Integral("width"));
01002     if(hEventEnergy_1D_CC->Integral("width")>0.0) hEventEnergy_1D_CC->Scale(1.0/hEventEnergy_1D_CC->Integral("width"));
01003     if(hCosTheta_1D_NC->Integral("width")>0.0) hCosTheta_1D_NC->Scale(1.0/hCosTheta_1D_NC->Integral("width"));
01004     if(hX_1D_NC->Integral("width")>0.0) hX_1D_NC->Scale(1.0/hX_1D_NC->Integral("width"));
01005     if(hY_1D_NC->Integral("width")>0.0) hY_1D_NC->Scale(1.0/hY_1D_NC->Integral("width"));
01006     if(hQ2_1D_NC->Integral("width")>0.0) hQ2_1D_NC->Scale(1.0/hQ2_1D_NC->Integral("width"));
01007     if(hW2_1D_NC->Integral("width")>0.0) hW2_1D_NC->Scale(1.0/hW2_1D_NC->Integral("width")); 
01008     if(hCosTheta_2D_NC->Integral("width")>0.0) hCosTheta_2D_NC->Scale(1.0/hCosTheta_2D_NC->Integral("width"));
01009     if(hX_2D_NC->Integral("width")>0.0) hX_2D_NC->Scale(1.0/hX_2D_NC->Integral("width"));
01010     if(hY_2D_NC->Integral("width")>0.0) hY_2D_NC->Scale(1.0/hY_2D_NC->Integral("width"));
01011     if(hQ2_2D_NC->Integral("width")>0.0) hQ2_2D_NC->Scale(1.0/hQ2_2D_NC->Integral("width"));
01012     if(hW2_2D_NC->Integral("width")>0.0) hW2_2D_NC->Scale(1.0/hW2_2D_NC->Integral("width"));
01013     if(hE_2D_NC->Integral("width")>0.0) hE_2D_NC->Scale(1.0/hE_2D_NC->Integral("width"));
01014     if(hTrackPHfrac_1D_NC->Integral("width")>0.0) hTrackPHfrac_1D_NC->Scale(1.0/hTrackPHfrac_1D_NC->Integral("width"));
01015     if(hTrackPHmean_1D_NC->Integral("width")>0.0) hTrackPHmean_1D_NC->Scale(1.0/hTrackPHmean_1D_NC->Integral("width"));
01016     if(hTrackQPsigmaQP_1D_NC->Integral("width")>0.0) hTrackQPsigmaQP_1D_NC->Scale(1.0/hTrackQPsigmaQP_1D_NC->Integral("width"));
01017     if(hTrackLikePlanes_1D_NC->Integral("width")>0.0) hTrackLikePlanes_1D_NC->Scale(1.0/hTrackLikePlanes_1D_NC->Integral("width"));
01018     if(hTrackPHfrac_2D_NC->Integral("width")>0.0) hTrackPHfrac_2D_NC->Scale(1.0/hTrackPHfrac_2D_NC->Integral("width"));
01019     if(hTrackPHmean_2D_NC->Integral("width")>0.0) hTrackPHmean_2D_NC->Scale(1.0/hTrackPHmean_2D_NC->Integral("width"));
01020     if(hTrackQPsigmaQP_2D_NC->Integral("width")>0.0) hTrackQPsigmaQP_2D_NC->Scale(1.0/hTrackQPsigmaQP_2D_NC->Integral("width"));
01021     if(hTrackLikePlanes_2D_NC->Integral("width")>0.0) hTrackLikePlanes_2D_NC->Scale(1.0/hTrackLikePlanes_2D_NC->Integral("width"));
01022     if(hTrackPlanes_2D_NC_1->Integral("width")>0.0) hTrackPlanes_2D_NC_1->Scale(1.0/hTrackPlanes_2D_NC_1->Integral("width"));
01023     if(hTrackPlanes_2D_NC_2->Integral("width")>0.0) hTrackPlanes_2D_NC_2->Scale(1.0/hTrackPlanes_2D_NC_2->Integral("width"));
01024     if(hTrackCharge_1D_NC->Integral("width")>0.0) hTrackCharge_1D_NC->Scale(1.0/hTrackCharge_1D_NC->Integral("width"));
01025     if(hTrackEnergy_1D_NC->Integral("width")>0.0) hTrackEnergy_1D_NC->Scale(1.0/hTrackEnergy_1D_NC->Integral("width"));
01026     if(hEventEnergy_1D_NC->Integral("width")>0.0) hEventEnergy_1D_NC->Scale(1.0/hEventEnergy_1D_NC->Integral("width"));
01027     if(hNormalization->Integral("width")>0.0) hNormalization->Scale(1.0/hNormalization->Integral("width"));
01028 
01029     MSG("MadAb",Msg::kDebug) << endl
01030       << "  normalizing histograms [after]: " << endl
01031       << "   hCosTheta_1D_CC: " << hCosTheta_1D_CC->Integral("width") << endl
01032       << "   hX_1D_CC: " << hX_1D_CC->Integral("width") << endl
01033       << "   hY_1D_CC: " << hY_1D_CC->Integral("width") << endl
01034       << "   hQ2_1D_CC: " << hQ2_1D_CC->Integral("width") << endl
01035       << "   hW2_1D_CC: " << hW2_1D_CC->Integral("width") << endl
01036       << "   hCosTheta_2D_CC: " << hCosTheta_2D_CC->Integral("width") << endl
01037       << "   hX_2D_CC: " << hX_2D_CC->Integral("width") << endl
01038       << "   hY_2D_CC: " << hY_2D_CC->Integral("width") << endl
01039       << "   hQ2_2D_CC: " << hQ2_2D_CC->Integral("width") << endl
01040       << "   hW2_2D_CC: " << hW2_2D_CC->Integral("width") << endl
01041       << "   hE_2D_CC: " << hE_2D_CC->Integral("width") << endl
01042       << "   hTrackPHfrac_1D_CC: " << hTrackPHfrac_1D_CC->Integral("width") << endl
01043       << "   hTrackPHmean_1D_CC: " << hTrackPHmean_1D_CC->Integral("width") << endl
01044       << "   hTrackQPsigmaQP_1D_CC: " << hTrackQPsigmaQP_1D_CC->Integral("width") << endl
01045       << "   hTrackLikePlanes_1D_CC: " << hTrackLikePlanes_1D_CC->Integral("width") << endl
01046       << "   hTrackPHfrac_2D_CC: " << hTrackPHfrac_2D_CC->Integral("width") << endl
01047       << "   hTrackPHmean_2D_CC: " << hTrackPHmean_2D_CC->Integral("width") << endl
01048       << "   hTrackQPsigmaQP_2D_CC: " << hTrackQPsigmaQP_2D_CC->Integral("width") << endl
01049       << "   hTrackLikePlanes_2D_CC: " << hTrackLikePlanes_2D_CC->Integral("width") << endl
01050       << "   hTrackPlanes_2D_CC_1: " << hTrackPlanes_2D_CC_1->Integral("width") << endl
01051       << "   hTrackPlanes_2D_CC_2: " << hTrackPlanes_2D_CC_2->Integral("width") << endl
01052       << "   hTrackCharge_1D_CC: " << hTrackCharge_1D_CC->Integral("width") << endl
01053       << "   hTrackEnergy_1D_CC: " << hTrackEnergy_1D_CC->Integral("width") << endl
01054       << "   hEventEnergy_1D_CC: " << hEventEnergy_1D_CC->Integral("width") << endl
01055       << "   hCosTheta_1D_NC: " << hCosTheta_1D_NC->Integral("width") << endl
01056       << "   hX_1D_NC: " << hX_1D_NC->Integral("width") << endl
01057       << "   hY_1D_NC: " << hY_1D_NC->Integral("width") << endl
01058       << "   hQ2_1D_NC: " << hQ2_1D_NC->Integral("width") << endl
01059       << "   hW2_1D_NC: " << hW2_1D_NC->Integral("width") << endl
01060       << "   hCosTheta_2D_NC: " << hCosTheta_2D_NC->Integral("width") << endl
01061       << "   hX_2D_NC: " << hX_2D_NC->Integral("width") << endl
01062       << "   hY_2D_NC: " << hY_2D_NC->Integral("width") << endl
01063       << "   hQ2_2D_NC: " << hQ2_2D_NC->Integral("width") << endl
01064       << "   hW2_2D_NC: " << hW2_2D_NC->Integral("width") << endl
01065       << "   hE_2D_NC: " << hE_2D_NC->Integral("width") << endl
01066       << "   hTrackPHfrac_1D_NC: " << hTrackPHfrac_1D_NC->Integral("width") << endl
01067       << "   hTrackPHmean_1D_NC: " << hTrackPHmean_1D_NC->Integral("width") << endl
01068       << "   hTrackQPsigmaQP_1D_NC: " << hTrackQPsigmaQP_1D_NC->Integral("width") << endl
01069       << "   hTrackLikePlanes_1D_NC: " << hTrackLikePlanes_1D_NC->Integral("width") << endl
01070       << "   hTrackPHfrac_2D_NC: " << hTrackPHfrac_2D_NC->Integral("width") << endl
01071       << "   hTrackPHmean_2D_NC: " << hTrackPHmean_2D_NC->Integral("width") << endl
01072       << "   hTrackQPsigmaQP_2D_NC: " << hTrackQPsigmaQP_2D_NC->Integral("width") << endl
01073       << "   hTrackLikePlanes_2D_NC: " << hTrackLikePlanes_2D_NC->Integral("width") << endl
01074       << "   hTrackPlanes_2D_NC_1: " << hTrackPlanes_2D_NC_1->Integral("width") << endl
01075       << "   hTrackPlanes_2D_NC_2: " << hTrackPlanes_2D_NC_2->Integral("width") << endl
01076       << "   hTrackCharge_1D_NC: " << hTrackCharge_1D_NC->Integral("width") << endl
01077       << "   hTrackEnergy_1D_NC: " << hTrackEnergy_1D_NC->Integral("width") << endl
01078       << "   hEventEnergy_1D_NC: " << hEventEnergy_1D_NC->Integral("width") << endl
01079       << "   hNormalization: " << hNormalization->Integral("width") << endl;
01080   }
01081 }
01082 
01083 void MadAbID::FillPDFs(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord, Int_t ccnc)
01084 {
01085   this->FillPDFs(ntpEvent,ntpRecord,ccnc,1.0);
01086 }
01087 
01088 void MadAbID::FillPDFs(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord, Int_t ccnc, Double_t osc)
01089 {
01090   MSG("MadAb",Msg::kDebug) << " *** MadAbID::FillPDFs(...) *** " << endl;
01091 
01092   // get PDF histograms
01093   // ==================
01094   if( !fFoundPdfs ) this->MakePDFs();
01095 
01096   // fill PDFs
01097   // =========
01098   if( fFoundPdfs ){
01099 
01100     // calculate Reco variables
01101     // ========================
01102     this->MakeRecoVariables(ntpEvent,ntpRecord);
01103   
01104     Int_t bin,binx,biny;
01105     Double_t widthx,widthy;
01106     Double_t area,weight,var;
01107     Double_t p,ptot,mean,sigma;
01108     Int_t min,max,trkplanes;
01109 
01110     // reco CosTheta (1D)
01111     // ================== 
01112     if( TRKplanes>0 ){
01113       var = RECOdircosneu;  
01114       bin = hCosTheta_1D_CC->FindBin(var);
01115       area = hCosTheta_1D_CC->GetBinWidth(bin);
01116 
01117       if( area!=0.0 ){
01118       weight = osc/area;
01119         if( ccnc==1 ) hCosTheta_1D_CC->Fill(var,weight);
01120         if( ccnc==0 ) hCosTheta_1D_NC->Fill(var,weight);
01121       }
01122     }
01123 
01124     // reco X (1D)
01125     // =========== 
01126     if( TRKplanes>0 ){
01127       var = RECOx;  
01128       bin = hX_1D_CC->FindBin(var);
01129       area = hX_1D_CC->GetBinWidth(bin);
01130 
01131       if( area!=0.0 ){
01132         weight = osc/area;
01133         if( ccnc==1 ) hX_1D_CC->Fill(var,weight);
01134         if( ccnc==0 ) hX_1D_NC->Fill(var,weight);
01135       }
01136     }
01137 
01138     // reco Y (1D)
01139     // =========== 
01140     if( TRKplanes>0 ){
01141       var = RECOy;
01142       bin = hY_1D_CC->FindBin(var);
01143       area = hY_1D_CC->GetBinWidth(bin);
01144 
01145       if( area!=0.0 ){
01146         weight = osc/area;
01147         if( ccnc==1 ) hY_1D_CC->Fill(var,weight);
01148         if( ccnc==0 ) hY_1D_NC->Fill(var,weight);
01149       }
01150     }
01151 
01152     // reco Q2 (1D)
01153     // ===========   
01154     if( TRKplanes>0 ){
01155       var = RECOq2;
01156       bin = hQ2_1D_CC->FindBin(var);
01157       area = hQ2_1D_CC->GetBinWidth(bin);
01158 
01159       if( area!=0.0 ){
01160         weight = osc/area;
01161         if( ccnc==1 ) hQ2_1D_CC->Fill(var,weight);
01162         if( ccnc==0 ) hQ2_1D_NC->Fill(var,weight);
01163       }
01164     }
01165 
01166     // reco W2 (1D)
01167     // ===========   
01168     if( TRKplanes>0 ){
01169       var = RECOw2;
01170       bin = hW2_1D_CC->FindBin(var);
01171       area = hW2_1D_CC->GetBinWidth(bin);
01172 
01173       if( area!=0.0 ){
01174         weight = osc/area;
01175         if( ccnc==1 ) hW2_1D_CC->Fill(var,weight);
01176         if( ccnc==0 ) hW2_1D_NC->Fill(var,weight);
01177       }
01178     }
01179 
01180     // reco CosTheta (2D)
01181     // ==================
01182     if( TRKplanes>0 ){
01183       var = RECOdircosneu;
01184       binx = hCosTheta_2D_CC->GetXaxis()->FindBin(RECOenu);
01185       widthx = hCosTheta_2D_CC->GetXaxis()->GetBinWidth(binx);
01186       biny = hCosTheta_2D_CC->GetYaxis()->FindBin(var);
01187       widthy = hCosTheta_2D_CC->GetYaxis()->GetBinWidth(biny);
01188       area = widthx*widthy;
01189 
01190       if( area!=0.0 ){
01191         weight = osc/area;
01192         if( ccnc==1 ) hCosTheta_2D_CC->Fill(RECOenu,var,weight);
01193         if( ccnc==0 ) hCosTheta_2D_NC->Fill(RECOenu,var,weight);
01194       }
01195     }
01196 
01197     // reco X (2D)
01198     // ===========
01199     if( TRKplanes>0 ){
01200       var = RECOx;
01201       binx = hX_2D_CC->GetXaxis()->FindBin(RECOenu);
01202       widthx = hX_2D_CC->GetXaxis()->GetBinWidth(binx);
01203       biny = hX_2D_CC->GetYaxis()->FindBin(var);
01204       widthy = hX_2D_CC->GetYaxis()->GetBinWidth(biny);
01205       area = widthx*widthy;
01206 
01207       if( area!=0.0 ){
01208         weight = osc/area;
01209         if( ccnc==1 ) hX_2D_CC->Fill(RECOenu,var,weight);
01210         if( ccnc==0 ) hX_2D_NC->Fill(RECOenu,var,weight);
01211       }
01212     }
01213 
01214     // reco Y (2D)
01215     // ===========
01216     if( TRKplanes>0 ){
01217       var = RECOy;
01218       binx = hY_2D_CC->GetXaxis()->FindBin(RECOenu);
01219       widthx = hY_2D_CC->GetXaxis()->GetBinWidth(binx);
01220       biny = hY_2D_CC->GetYaxis()->FindBin(var);
01221       widthy = hY_2D_CC->GetYaxis()->GetBinWidth(biny);
01222       area = widthx*widthy;
01223 
01224       if( area!=0.0 ){
01225         weight = osc/area;
01226         if( ccnc==1 ) hY_2D_CC->Fill(RECOenu,var,weight);
01227         if( ccnc==0 ) hY_2D_NC->Fill(RECOenu,var,weight);
01228       }
01229     }
01230 
01231     // reco Q2 (2D)
01232     // ============
01233     if( TRKplanes>0 ){
01234       var = RECOq2;
01235       binx = hQ2_2D_CC->GetXaxis()->FindBin(RECOenu);
01236       widthx = hQ2_2D_CC->GetXaxis()->GetBinWidth(binx);
01237       biny = hQ2_2D_CC->GetYaxis()->FindBin(var);
01238       widthy = hQ2_2D_CC->GetYaxis()->GetBinWidth(biny);
01239       area = widthx*widthy;
01240 
01241       if( area!=0.0 ){
01242         weight = osc/area;
01243         if( ccnc==1 ) hQ2_2D_CC->Fill(RECOenu,var,weight);
01244         if( ccnc==0 ) hQ2_2D_NC->Fill(RECOenu,var,weight);
01245       }
01246     }
01247 
01248     // reco W2 (2D)
01249     // ============
01250     if( TRKplanes>0 ){
01251       var = RECOw2;
01252       binx = hW2_2D_CC->GetXaxis()->FindBin(RECOenu);
01253       widthx = hW2_2D_CC->GetXaxis()->GetBinWidth(binx);
01254       biny = hW2_2D_CC->GetYaxis()->FindBin(var);
01255       widthy = hW2_2D_CC->GetYaxis()->GetBinWidth(biny);
01256       area = widthx*widthy;
01257 
01258       if( area!=0.0 ){
01259         weight = osc/area;
01260         if( ccnc==1 ) hW2_2D_CC->Fill(RECOenu,var,weight);
01261         if( ccnc==0 ) hW2_2D_NC->Fill(RECOenu,var,weight);
01262       }
01263     }
01264 
01265     // reco E (normalization)
01266     // ======================
01267     if( TRKplanes>0 ){
01268       bin = hE_2D_CC->FindBin(RECOenu);
01269       area = hE_2D_CC->GetBinWidth(bin);
01270 
01271       if( area!=0.0 ){
01272         weight = osc/area;
01273         if( ccnc==1 ) hE_2D_CC->Fill(RECOenu,weight);
01274         if( ccnc==0 ) hE_2D_NC->Fill(RECOenu,weight);
01275       }
01276     }   
01277 
01278     // fractional pulse height (1D)
01279     // ============================
01280     if( TRKplanes>0 ){
01281       var = TRKtotph/RECOtotph;
01282       bin = hTrackPHfrac_1D_CC->FindBin(var);
01283       area = hTrackPHfrac_1D_CC->GetBinWidth(bin);
01284 
01285       if( area!=0.0 ){
01286         weight = osc/area;
01287         if( ccnc==1 ) hTrackPHfrac_1D_CC->Fill(var,weight);
01288         if( ccnc==0 ) hTrackPHfrac_1D_NC->Fill(var,weight);
01289       }
01290     }
01291 
01292     // average pulse height (1D)
01293     // =========================
01294     if( TRKplanes>0 ){
01295       if(TRKtrackplanes>2) var = TRKtrkph/TRKtrackplanes;
01296       else var = TRKtotph/TRKplanes;
01297       bin = hTrackPHmean_1D_CC->FindBin(var);
01298       area = hTrackPHmean_1D_CC->GetBinWidth(bin);
01299 
01300       if( area!=0.0 ){
01301         weight = osc/area;
01302         if( ccnc==1 ) hTrackPHmean_1D_CC->Fill(var,weight);
01303         if( ccnc==0 ) hTrackPHmean_1D_NC->Fill(var,weight);
01304       }   
01305     }
01306 
01307     // track fit error (1D)
01308     // ====================
01309     if( TRKplanes>0 ){
01310       var = fabs(TRKFITqpsigmaqp);
01311       bin = hTrackQPsigmaQP_1D_CC->FindBin(var);
01312       area = hTrackQPsigmaQP_1D_CC->GetBinWidth(bin);
01313 
01314       if( area!=0.0 ){
01315         weight = osc/area;
01316         if( ccnc==1 ) hTrackQPsigmaQP_1D_CC->Fill(var,weight);
01317         if( ccnc==0 ) hTrackQPsigmaQP_1D_NC->Fill(var,weight);
01318       }
01319     }
01320 
01321     // track-like planes (1D)
01322     // ======================
01323     if( TRKplanes>0 ){
01324       var = TRKtrackplanes;
01325       bin = hTrackLikePlanes_1D_CC->FindBin(var);
01326       area = hTrackLikePlanes_1D_CC->GetBinWidth(bin);
01327 
01328       if( area!=0.0 ){
01329         weight = osc/area;
01330         if( ccnc==1 ) hTrackLikePlanes_1D_CC->Fill(var,weight);
01331         if( ccnc==0 ) hTrackLikePlanes_1D_NC->Fill(var,weight);
01332       }
01333     }
01334 
01335     // fractional pulse height (2D)
01336     // ============================
01337     if( TRKplanes>0 ){
01338       trkplanes = TRKplanes;
01339       var = TRKtotph/RECOtotph;
01340         
01341       mean = trkplanes;
01342       sigma = sqrt(mean);
01343       min = (Int_t)(mean-2.0*sigma); if(min<5) min=5;
01344       max = (Int_t)(mean+2.0*sigma); if(max>485) max=485;
01345 
01346       ptot = 0.0;
01347       for( Int_t pln=min; pln<=max; pln++ ){
01348         p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01349         ptot += p;
01350       }
01351 
01352       for( Int_t pln=min; pln<=max; pln++ ){
01353         binx = hTrackPHfrac_2D_CC->GetXaxis()->FindBin(pln);
01354         widthx = hTrackPHfrac_2D_CC->GetXaxis()->GetBinWidth(binx);
01355         biny = hTrackPHfrac_2D_CC->GetYaxis()->FindBin(var);
01356         widthy = hTrackPHfrac_2D_CC->GetYaxis()->GetBinWidth(biny);
01357         area = widthx*widthy;
01358         if( area!=0.0 ){
01359           p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01360           weight = (osc/area)*(p/ptot);
01361           if( ccnc==1 ) hTrackPHfrac_2D_CC->Fill(pln,var,weight);
01362           if( ccnc==0 ) hTrackPHfrac_2D_NC->Fill(pln,var,weight);
01363         }
01364       }
01365     }
01366 
01367     // average pulse height (2D)
01368     // =========================
01369     if( TRKplanes>0 ){
01370       trkplanes = TRKplanes;
01371       if(TRKtrackplanes>2) var = TRKtrkph/TRKtrackplanes;
01372       else var = TRKtotph/TRKplanes;
01373 
01374       mean = trkplanes;
01375       sigma = sqrt(mean);
01376       min = (Int_t)(mean-2.0*sigma); if(min<5) min=5;
01377       max = (Int_t)(mean+2.0*sigma); if(max>485) max=485;
01378 
01379       ptot = 0.0;
01380       for( Int_t pln=min; pln<=max; pln++ ){
01381         p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01382         ptot += p;
01383       }
01384 
01385       for( Int_t pln=min; pln<=max; pln++ ){
01386         binx = hTrackPHmean_2D_CC->GetXaxis()->FindBin(pln);
01387         widthx = hTrackPHmean_2D_CC->GetXaxis()->GetBinWidth(binx);
01388         biny = hTrackPHmean_2D_CC->GetYaxis()->FindBin(var);
01389         widthy = hTrackPHmean_2D_CC->GetYaxis()->GetBinWidth(biny);
01390         area = widthx*widthy;
01391 
01392         if( area!=0.0 ){
01393           p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01394           weight = (osc/area)*(p/ptot);
01395           if( ccnc==1 ) hTrackPHmean_2D_CC->Fill(pln,var,weight);
01396           if( ccnc==0 ) hTrackPHmean_2D_NC->Fill(pln,var,weight);
01397         }
01398       }
01399     }
01400 
01401     // track fit error (2D)
01402     // ====================
01403     if( TRKplanes>0 ){
01404       trkplanes = TRKplanes;
01405       var = fabs(TRKFITqpsigmaqp);
01406 
01407       mean = trkplanes;
01408       sigma = sqrt(mean);
01409       min = (Int_t)(mean-2.0*sigma); if(min<5) min=5;
01410       max = (Int_t)(mean+2.0*sigma); if(max>485) max=485;
01411 
01412       ptot = 0.0;
01413       for( Int_t pln=min; pln<=max; pln++ ){
01414         p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01415         ptot += p;
01416       }
01417 
01418       for( Int_t pln=min; pln<=max; pln++ ){
01419         binx = hTrackQPsigmaQP_2D_CC->GetXaxis()->FindBin(pln);
01420         widthx = hTrackQPsigmaQP_2D_CC->GetXaxis()->GetBinWidth(binx); 
01421         biny = hTrackQPsigmaQP_2D_CC->GetYaxis()->FindBin(var);
01422         widthy = hTrackQPsigmaQP_2D_CC->GetYaxis()->GetBinWidth(biny);
01423         area = widthx*widthy;
01424 
01425         if( area!=0.0 ){
01426           p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01427           weight = (osc/area)*(p/ptot);
01428           if( ccnc==1 ) hTrackQPsigmaQP_2D_CC->Fill(pln,var,weight);
01429           if( ccnc==0 ) hTrackQPsigmaQP_2D_NC->Fill(pln,var,weight);
01430         }
01431       }
01432     }
01433 
01434     // track-like planes (2D)
01435     // ======================
01436     if( TRKplanes>0 ){
01437       var = TRKtrackplanes;
01438       binx = hTrackLikePlanes_2D_CC->GetXaxis()->FindBin(TRKplanes);
01439       widthx = hTrackLikePlanes_2D_CC->GetXaxis()->GetBinWidth(binx); 
01440       biny = hTrackLikePlanes_2D_CC->GetYaxis()->FindBin(var);
01441       widthy = hTrackLikePlanes_2D_CC->GetYaxis()->GetBinWidth(biny);
01442       area = widthx*widthy;
01443 
01444       if( area!=0.0 ){
01445         weight = osc/area;
01446         if( ccnc==1 ) hTrackLikePlanes_2D_CC->Fill(TRKplanes,var,weight);
01447         if( ccnc==0 ) hTrackLikePlanes_2D_NC->Fill(TRKplanes,var,weight);
01448       }
01449     }
01450 
01451     // track planes (normalization 1)
01452     // ==============================
01453     if( TRKplanes>0 ){
01454       bin = hTrackPlanes_2D_CC_1->FindBin(TRKplanes);
01455       area = hTrackPlanes_2D_CC_1->GetBinWidth(bin);
01456 
01457       if( area!=0.0 ){
01458         weight = osc/area;
01459         if( ccnc==1 ) hTrackPlanes_2D_CC_1->Fill(TRKplanes,weight);
01460         if( ccnc==0 ) hTrackPlanes_2D_NC_1->Fill(TRKplanes,weight);
01461       }
01462     }    
01463 
01464     // track planes (normalization 2)
01465     // ==============================
01466     if( TRKplanes>0 ){
01467       trkplanes = TRKplanes;
01468         
01469       mean = trkplanes;
01470       sigma = sqrt(mean);
01471       min = (Int_t)(mean-2.0*sigma); if(min<5) min=5;
01472       max = (Int_t)(mean+2.0*sigma); if(max>485) max=485;
01473 
01474       ptot = 0.0;
01475       for( Int_t pln=min; pln<=max; pln++ ){
01476         p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01477         ptot += p;
01478       }
01479 
01480       for( Int_t pln=min; pln<=max; pln++ ){
01481         bin = hTrackPlanes_2D_CC_2->FindBin(pln);
01482         area = hTrackPlanes_2D_CC_2->GetBinWidth(bin);
01483 
01484         if( area!=0.0 ){
01485           p = exp(-0.5*pow((pln-mean)/(sigma),2.0));
01486           weight = (osc/area)*(p/ptot);
01487           if( ccnc==1 ) hTrackPlanes_2D_CC_2->Fill(pln,weight);
01488           if( ccnc==0 ) hTrackPlanes_2D_NC_2->Fill(pln,weight);
01489         }
01490       }
01491     }
01492 
01493     // track charge (1D)
01494     // =================
01495     if( TRKplanes>0 ){
01496       var = TRKFITemcharge;
01497       bin = hTrackCharge_1D_CC->FindBin(var);
01498       area = hTrackCharge_1D_CC->GetBinWidth(bin);
01499 
01500       if( area!=0 ){
01501         weight = osc/area;
01502         if( ccnc==1 ) hTrackCharge_1D_CC->Fill(var,weight);
01503         if( ccnc==0 ) hTrackCharge_1D_NC->Fill(var,weight);
01504       }
01505     }
01506 
01507     // track energy (1D)
01508     // =================
01509     if( TRKplanes>0 ){
01510       var = TRKspanplanes;
01511       bin = hTrackEnergy_1D_CC->FindBin(var);
01512       area = hTrackEnergy_1D_CC->GetBinWidth(bin);
01513 
01514       if( area!=0.0 ){
01515         weight = osc/area;
01516         if( ccnc==1 ) hTrackEnergy_1D_CC->Fill(var,weight);
01517         if( ccnc==0 ) hTrackEnergy_1D_NC->Fill(var,weight);
01518       }   
01519     }
01520 
01521     // event energy (1D)
01522     // =================
01523     if( TRKplanes>0 ){
01524       var = RECOenu;
01525       bin = hEventEnergy_1D_CC->FindBin(var);
01526       area = hEventEnergy_1D_CC->GetBinWidth(bin);
01527 
01528       if( area!=0.0 ){
01529         weight = osc/area;
01530         if( ccnc==1 ) hEventEnergy_1D_CC->Fill(var,weight);
01531         if( ccnc==0 ) hEventEnergy_1D_NC->Fill(var,weight);
01532       }  
01533     }
01534     
01535     // CC/NC normalization
01536     // ===================
01537     if( TRKplanes>0 ){
01538       weight = osc;
01539       hNormalization->Fill(ccnc,weight);
01540     }
01541   }
01542 
01543 }
01544 
01545 void MadAbID::MakePDFs()
01546 {
01547   MSG("MadAb",Msg::kDebug) << " *** MadAbID::MakePDFs() *** " << endl;
01548 
01549   fMakePdfs = 1;
01550 
01551   if( fMakePdfs ){
01552 
01553     // Delete old PDFs
01554     // ===============
01555     if(hCosTheta_1D_CC) delete hCosTheta_1D_CC;
01556     if(hX_1D_CC) delete hX_1D_CC;
01557     if(hY_1D_CC) delete hY_1D_CC;
01558     if(hQ2_1D_CC) delete hQ2_1D_CC;
01559     if(hW2_1D_CC) delete hW2_1D_CC;
01560     if(hCosTheta_2D_CC) delete hCosTheta_2D_CC;
01561     if(hX_2D_CC) delete hX_2D_CC;
01562     if(hY_2D_CC) delete hY_2D_CC;
01563     if(hQ2_2D_CC) delete hQ2_2D_CC;
01564     if(hW2_2D_CC) delete hW2_2D_CC;
01565     if(hE_2D_CC) delete hE_2D_CC;
01566     if(hTrackPHfrac_1D_CC) delete hTrackPHfrac_1D_CC;
01567     if(hTrackPHmean_1D_CC) delete hTrackPHmean_1D_CC;
01568     if(hTrackQPsigmaQP_1D_CC) delete hTrackQPsigmaQP_1D_CC;
01569     if(hTrackLikePlanes_1D_CC) delete hTrackLikePlanes_1D_CC;
01570     if(hTrackPHfrac_2D_CC) delete hTrackPHfrac_2D_CC;
01571     if(hTrackPHmean_2D_CC) delete hTrackPHmean_2D_CC;
01572     if(hTrackQPsigmaQP_2D_CC) delete hTrackQPsigmaQP_2D_CC;
01573     if(hTrackLikePlanes_2D_CC) delete hTrackLikePlanes_2D_CC;
01574     if(hTrackPlanes_2D_CC_1) delete hTrackPlanes_2D_CC_1;
01575     if(hTrackPlanes_2D_CC_2) delete hTrackPlanes_2D_CC_2;
01576     if(hTrackCharge_1D_CC) delete hTrackCharge_1D_CC;
01577     if(hTrackEnergy_1D_CC) delete hTrackEnergy_1D_CC;
01578     if(hEventEnergy_1D_CC) delete hEventEnergy_1D_CC;
01579 
01580     if(hCosTheta_1D_NC) delete hCosTheta_1D_NC;
01581     if(hX_1D_NC) delete hX_1D_NC;
01582     if(hY_1D_NC) delete hY_1D_NC;
01583     if(hQ2_1D_NC) delete hQ2_1D_NC;
01584     if(hW2_1D_NC) delete hW2_1D_NC;
01585     if(hCosTheta_2D_NC) delete hCosTheta_2D_NC;
01586     if(hX_2D_NC) delete hX_2D_NC;
01587     if(hY_2D_NC) delete hY_2D_NC;
01588     if(hQ2_2D_NC) delete hQ2_2D_NC;
01589     if(hW2_2D_NC) delete hW2_2D_NC;
01590     if(hE_2D_NC) delete hE_2D_NC;
01591     if(hTrackPHfrac_1D_NC) delete hTrackPHfrac_1D_NC;
01592     if(hTrackPHmean_1D_NC) delete hTrackPHmean_1D_NC;
01593     if(hTrackQPsigmaQP_1D_NC) delete hTrackQPsigmaQP_1D_NC;
01594     if(hTrackLikePlanes_1D_NC) delete hTrackLikePlanes_1D_NC;
01595     if(hTrackPHfrac_2D_NC) delete hTrackPHfrac_2D_NC;
01596     if(hTrackPHmean_2D_NC) delete hTrackPHmean_2D_NC;
01597     if(hTrackQPsigmaQP_2D_NC) delete hTrackQPsigmaQP_2D_NC;
01598     if(hTrackLikePlanes_2D_NC) delete hTrackLikePlanes_2D_NC;
01599     if(hTrackPlanes_2D_NC_1) delete hTrackPlanes_2D_NC_1;
01600     if(hTrackPlanes_2D_NC_2) delete hTrackPlanes_2D_NC_2;
01601     if(hTrackCharge_1D_NC) delete hTrackCharge_1D_NC;
01602     if(hTrackEnergy_1D_NC) delete hTrackEnergy_1D_NC;
01603     if(hEventEnergy_1D_NC) delete hEventEnergy_1D_NC;
01604 
01605     if(hNormalization) delete hNormalization;
01606 
01607     fFoundPdfs = 0;
01608 
01609     // 1D HISTOGRAMS
01610     // =============
01611 
01612     Double_t* xcos = new Double_t[9];
01613     xcos[0]=-0.10;
01614     xcos[1]=+0.30;
01615     xcos[2]=+0.50;
01616     xcos[3]=+0.65;
01617     xcos[4]=+0.76;
01618     xcos[5]=+0.85;
01619     xcos[6]=+0.92;
01620     xcos[7]=+0.97;
01621     xcos[8]=+1.00;
01622 
01623     hCosTheta_1D_CC = new TH1D("hCosTheta_1D_CC","hCosTheta_1D_CC",8,xcos);
01624     hCosTheta_1D_NC = new TH1D("hCosTheta_1D_NC","hCosTheta_1D_NC",8,xcos);
01625     hCosTheta_1D_CC->SetLineColor(2);
01626     hCosTheta_1D_CC->SetLineWidth(2);
01627     hCosTheta_1D_NC->SetLineColor(4);
01628     hCosTheta_1D_NC->SetLineWidth(2);
01629 
01630     hX_1D_CC = new TH1D("hX_1D_CC","hX_1D_CC",1,0.0,1.0); // 1 bin
01631     hX_1D_NC = new TH1D("hX_1D_NC","hX_1D_NC",1,0.0,1.0);
01632     hX_1D_CC->SetLineColor(2);
01633     hX_1D_CC->SetLineWidth(2);
01634     hX_1D_NC->SetLineColor(4);
01635     hX_1D_NC->SetLineWidth(2);
01636 
01637     hY_1D_CC = new TH1D("hY_1D_CC","hY_1D_CC",50,0.0,1.0);
01638     hY_1D_NC = new TH1D("hY_1D_NC","hY_1D_NC",50,0.0,1.0);
01639     hY_1D_CC->SetLineColor(2);
01640     hY_1D_CC->SetLineWidth(2);
01641     hY_1D_NC->SetLineColor(4);
01642     hY_1D_NC->SetLineWidth(2);
01643 
01644     hQ2_1D_CC = new TH1D("hQ2_1D_CC","hQ2_1D_CC",1,0.0,1000.0); // 1 bin
01645     hQ2_1D_NC = new TH1D("hQ2_1D_NC","hQ2_1D_NC",1,0.0,1000.0);
01646     hQ2_1D_CC->SetLineColor(2);
01647     hQ2_1D_CC->SetLineWidth(2);
01648     hQ2_1D_NC->SetLineColor(4);
01649     hQ2_1D_NC->SetLineWidth(2);
01650 
01651     hW2_1D_CC = new TH1D("hW2_1D_CC","hW2_1D_CC",1,0.0,1000.0); // 1 bin
01652     hW2_1D_NC = new TH1D("hW2_1D_NC","hW2_1D_NC",1,0.0,1000.0);
01653     hW2_1D_CC->SetLineColor(2);
01654     hW2_1D_CC->SetLineWidth(2);
01655     hW2_1D_NC->SetLineColor(4);
01656     hW2_1D_NC->SetLineWidth(2);
01657 
01658     hTrackPHfrac_1D_CC = new TH1D("hTrackPHfrac_1D_CC","hTrackPHfrac_1D_CC",50,0.001,1.001);
01659     hTrackPHfrac_1D_NC = new TH1D("hTrackPHfrac_1D_NC","hTrackPHfrac_1D_NC",50,0.001,1.001);
01660     hTrackPHfrac_1D_CC->SetLineColor(2);
01661     hTrackPHfrac_1D_CC->SetLineWidth(2);
01662     hTrackPHfrac_1D_NC->SetLineColor(4);
01663     hTrackPHfrac_1D_NC->SetLineWidth(2);
01664 
01665     Double_t* xph = new Double_t[37];
01666     xph[0] = 0.0;
01667     xph[1] = 100.0;
01668     xph[2] = 150.0;
01669     for(Int_t i=3; i<31; i++){
01670       xph[i] = 180.0 + 20.0*(i-3.0);
01671     }
01672     xph[31] = 750.0;
01673     xph[32] = 800.0;
01674     xph[33] = 1000.0;
01675     xph[34] = 2000.0;
01676     xph[35] = 5000.0;
01677     xph[36] = 10000.0;
01678 
01679     hTrackPHmean_1D_CC = new TH1D("hTrackPHmean_1D_CC","hTrackPHmean_1D_CC",36,xph);
01680     hTrackPHmean_1D_NC = new TH1D("hTrackPHmean_1D_NC","hTrackPHmean_1D_NC",36,xph);
01681     hTrackPHmean_1D_CC->SetLineColor(2); 
01682     hTrackPHmean_1D_CC->SetLineWidth(2);
01683     hTrackPHmean_1D_NC->SetLineColor(4);
01684     hTrackPHmean_1D_NC->SetLineWidth(2);
01685 
01686     Double_t* xqp = new Double_t[46];
01687   
01688     for(Int_t i=0; i<20; i++){
01689       xqp[i] = 0.0 + 1.0*(i-0.0);
01690     }
01691  
01692     for(Int_t i=20; i<35; i++){
01693       xqp[i] = +20.0 + 2.0*(i-20.0);
01694     }
01695  
01696     for(Int_t i=35; i<42; i++){
01697       xqp[i] = +50.0 + 5.0*(i-35.0);
01698     }
01699  
01700     xqp[42] = +90.0;
01701     xqp[43] = +100.0;
01702     xqp[44] = +250.0;
01703     xqp[45] = +1000.0;
01704 
01705     hTrackQPsigmaQP_1D_CC = new TH1D("hTrackQPsigmaQP_1D_CC","hTrackQPsigmaQP_1D_CC",45,xqp);
01706     hTrackQPsigmaQP_1D_NC = new TH1D("hTrackQPsigmaQP_1D_NC","hTrackQPsigmaQP_1D_NC",45,xqp);
01707     hTrackQPsigmaQP_1D_CC->SetLineColor(2);
01708     hTrackQPsigmaQP_1D_CC->SetLineWidth(2);
01709     hTrackQPsigmaQP_1D_NC->SetLineColor(4);
01710     hTrackQPsigmaQP_1D_NC->SetLineWidth(2);
01711 
01712     Double_t* xtrk = new Double_t[151];
01713  
01714     for(Int_t i=0; i<100; i++){
01715       xtrk[i] = -0.5+0.0+1.0*(i-0.0);
01716     }
01717  
01718     for(Int_t i=100; i<120; i++){
01719       xtrk[i] = -0.5+100.0+5.0*(i-100.0);
01720     }
01721  
01722     for(Int_t i=120; i<150; i++){
01723       xtrk[i] = -0.5+200.0+10.0*(i-120.0);
01724     }
01725  
01726     xtrk[150] = -0.5+500.0;
01727 
01728     hTrackLikePlanes_1D_CC = new TH1D("hTrackLikePlanes_1D_CC","hTrackLikePlanes_1D_CC",150,xtrk);
01729     hTrackLikePlanes_1D_NC = new TH1D("hTrackLikePlanes_1D_NC","hTrackLikePlanes_1D_NC",150,xtrk);
01730 
01731     hTrackLikePlanes_1D_CC->SetLineColor(2);
01732     hTrackLikePlanes_1D_CC->SetLineWidth(2);
01733     hTrackLikePlanes_1D_NC->SetLineColor(4);
01734     hTrackLikePlanes_1D_NC->SetLineWidth(2);
01735   
01736     hTrackCharge_1D_CC = new TH1D("hTrackCharge_1D_CC","hTrackCharge_1D_CC",3,-1.5,+1.5);
01737     hTrackCharge_1D_NC = new TH1D("hTrackCharge_1D_NC","hTrackCharge_1D_NC",3,-1.5,+1.5);
01738     hTrackCharge_1D_CC->SetLineColor(2);
01739     hTrackCharge_1D_CC->SetLineWidth(2);
01740     hTrackCharge_1D_NC->SetLineColor(4);
01741     hTrackCharge_1D_NC->SetLineWidth(2);
01742 
01743     hTrackEnergy_1D_CC = new TH1D("hTrackEnergy_1D_CC","hTrackEnergy_1D_CC",150,xtrk);
01744     hTrackEnergy_1D_NC = new TH1D("hTrackEnergy_1D_NC","hTrackEnergy_1D_NC",150,xtrk);
01745     hTrackEnergy_1D_CC->SetLineColor(2);
01746     hTrackEnergy_1D_CC->SetLineWidth(2);
01747     hTrackEnergy_1D_NC->SetLineColor(4);
01748     hTrackEnergy_1D_NC->SetLineWidth(2);
01749 
01750     Double_t* xevt = new Double_t[53];
01751 
01752     for(Int_t i=0; i<20; i++){
01753       xevt[i] = 0.0 + 0.5*(i-0.0);
01754     }
01755 
01756     for(Int_t i=20; i<30; i++){
01757       xevt[i] = 10.0 + 1.0*(i-20.0);
01758     }
01759 
01760     for(Int_t i=30; i<45; i++){
01761       xevt[i] = 20.0 + 2.0*(i-30.0);
01762     }
01763 
01764     for(Int_t i=45; i<50; i++){
01765       xevt[i] = 50.0 + 5.0*(i-45.0);
01766     }
01767 
01768     xevt[50] = 80.0;
01769     xevt[51] = 100.0;
01770     xevt[52] = 1000.0;
01771 
01772     hEventEnergy_1D_CC = new TH1D("hEventEnergy_1D_CC","hEventEnergy_1D_CC",52,xevt);
01773     hEventEnergy_1D_NC = new TH1D("hEventEnergy_1D_NC","hEventEnergy_1D_NC",52,xevt);
01774     hEventEnergy_1D_CC->SetLineColor(2);
01775     hEventEnergy_1D_CC->SetLineWidth(2);
01776     hEventEnergy_1D_NC->SetLineColor(4);
01777     hEventEnergy_1D_NC->SetLineWidth(2);
01778 
01779     hNormalization = new TH1D("hNormalization","hNormalization",2,-0.5,1.5);
01780 
01781     // 2D HISTOGRAMS
01782     // =============
01783 
01784     Double_t* xenu = new Double_t[27];
01785 
01786     for(Int_t i=0; i<10; i++){
01787       xenu[i] = 0.0 + 1.0*(i-0.0);
01788     }
01789 
01790     for(Int_t i=10; i<15; i++){
01791       xenu[i] = 10.0 + 2.0*(i-10.0);
01792     }
01793 
01794     for(Int_t i=15; i<21; i++){
01795       xenu[i] = 20.0 + 5.0*(i-15.0);
01796     }
01797 
01798     for(Int_t i=21; i<24; i++){
01799       xenu[i] = 50.0 + 10.0*(i-21.0);
01800     }
01801 
01802     xenu[24] = 80.0;
01803     xenu[25] = 100.0;
01804     xenu[26] = 1000.0;
01805 
01806     hCosTheta_2D_CC = new TH2D("hCosTheta_2D_CC","hCosTheta_2D_CC",26,xenu,8,xcos);
01807     hCosTheta_2D_NC = new TH2D("hCosTheta_2D_NC","hCosTheta_2D_NC",26,xenu,8,xcos);
01808     hCosTheta_2D_CC->SetMarkerColor(2);
01809     hCosTheta_2D_NC->SetMarkerColor(4);
01810 
01811     hX_2D_CC = new TH2D("hX_2D_CC","hX_2D_CC",26,xenu,1,0.0,1.0);
01812     hX_2D_NC = new TH2D("hX_2D_NC","hX_2D_NC",26,xenu,1,0.0,1.0);
01813     hX_2D_CC->SetMarkerColor(2);
01814     hX_2D_NC->SetMarkerColor(4);
01815 
01816     hY_2D_CC = new TH2D("hY_2D_CC","hY_2D_CC",26,xenu,25,0.0,1.0);
01817     hY_2D_NC = new TH2D("hY_2D_NC","hY_2D_NC",26,xenu,25,0.0,1.0);
01818     hY_2D_CC->SetMarkerColor(2);
01819     hY_2D_NC->SetMarkerColor(4);
01820 
01821     hQ2_2D_CC = new TH2D("hQ2_2D_CC","hQ2_2D_CC",26,xenu,1,0.0,1000.0);
01822     hQ2_2D_NC = new TH2D("hQ2_2D_NC","hQ2_2D_NC",26,xenu,1,0.0,1000.0);
01823     hQ2_2D_CC->SetMarkerColor(2);
01824     hQ2_2D_NC->SetMarkerColor(4);
01825 
01826     hW2_2D_CC = new TH2D("hW2_2D_CC","hW2_2D_CC",26,xenu,1,0.0,1000.0);
01827     hW2_2D_NC = new TH2D("hW2_2D_NC","hW2_2D_NC",26,xenu,1,0.0,1000.0);
01828     hW2_2D_CC->SetMarkerColor(2);
01829     hW2_2D_NC->SetMarkerColor(4);
01830 
01831     hE_2D_CC = new TH1D("hE_2D_CC","hE_2D_CC",26,xenu);
01832     hE_2D_NC = new TH1D("hE_2D_NC","hE_2D_NC",26,xenu);
01833     hE_2D_CC->SetLineColor(2);
01834     hE_2D_CC->SetLineWidth(2);
01835     hE_2D_NC->SetLineColor(4);
01836     hE_2D_NC->SetLineWidth(2);
01837 
01838     Double_t* xemu = new Double_t[61]; // FINE BINNING
01839  
01840     for(Int_t i=0; i<25; i++){
01841       xemu[i] = -0.5+0.0+2.0*(i-0.0);
01842     }
01843  
01844     for(Int_t i=25; i<35; i++){
01845       xemu[i] = -0.5+50.0+5.0*(i-25.0);
01846     }
01847  
01848     for(Int_t i=35; i<45; i++){
01849       xemu[i] = -0.5+100.0+10.0*(i-35.0);
01850     }
01851 
01852     for(Int_t i=45; i<61; i++){
01853       xemu[i] = -0.5+200.0+20.0*(i-45.0);
01854     }
01855 
01856     Double_t* xemu2 = new Double_t[5]; // COARSE BINNING
01857     xemu2[0] = -0.5;
01858     xemu2[1] = 19.5;
01859     xemu2[2] = 39.5;
01860     xemu2[3] = 59.5;
01861     xemu2[4] = 499.5;
01862 
01863     hTrackPHfrac_2D_CC = new TH2D("hTrackPHfrac_2D_CC","hTrackPHfrac_2D_CC",60,xemu,25,0.001,1.001);
01864     hTrackPHfrac_2D_NC = new TH2D("hTrackPHfrac_2D_NC","hTrackPHfrac_2D_NC",60,xemu,25,0.001,1.001);
01865     hTrackPHfrac_2D_CC->SetMarkerColor(2);
01866     hTrackPHfrac_2D_NC->SetMarkerColor(4);
01867 
01868     Double_t* xph2 = new Double_t[22];
01869 
01870     xph2[0] = 0.0;
01871     xph2[1] = 100.0;
01872 
01873     for(Int_t i=2; i<15; i++){
01874       xph2[i] = 150.0 + 50.0*(i-2.0);
01875     }
01876 
01877     xph2[15] = 800.0;
01878     xph2[16] = 900.0;
01879     xph2[17] = 1000.0;
01880     xph2[18] = 1500.0;
01881     xph2[19] = 2500.0;
01882     xph2[20] = 5000.0;
01883     xph2[21] = 10000.0;
01884 
01885     hTrackPHmean_2D_CC = new TH2D("hTrackPHmean_2D_CC","hTrackPHmean_2D_CC",60,xemu,21,xph2);
01886     hTrackPHmean_2D_NC = new TH2D("hTrackPHmean_2D_NC","hTrackPHmean_2D_NC",60,xemu,21,xph2);
01887     hTrackPHmean_2D_CC->SetMarkerColor(2);
01888     hTrackPHmean_2D_NC->SetMarkerColor(4);
01889 
01890     Double_t* xqp2 = new Double_t[35];
01891  
01892     for(Int_t i=0; i<25; i++){
01893       xqp2[i] = 0.0 + 2.0*(i-0.0);
01894     }
01895  
01896     for(Int_t i=25; i<30; i++){
01897       xqp2[i] = +50.0 + 5.0*(i-25.0);
01898     }
01899 
01900     xqp2[30] = +80.0;
01901     xqp2[31] = +90.0;
01902     xqp2[32] = +100.0;
01903     xqp2[33] = +250.0;
01904     xqp2[34] = +1000.0;
01905 
01906     hTrackQPsigmaQP_2D_CC = new TH2D("hTrackQPsigmaQP_2D_CC","hTrackQPsigmaQP_2D_CC",60,xemu,34,xqp2);
01907     hTrackQPsigmaQP_2D_NC = new TH2D("hTrackQPsigmaQP_2D_NC","hTrackQPsigmaQP_2D_NC",60,xemu,34,xqp2);
01908     hTrackQPsigmaQP_2D_CC->SetMarkerColor(2);
01909     hTrackQPsigmaQP_2D_NC->SetMarkerColor(4);
01910 
01911     hTrackLikePlanes_2D_CC = new TH2D("hTrackLikePlanes_2D_CC","hTrackLikePlanes_2D_CC",60,xemu,60,xemu);
01912     hTrackLikePlanes_2D_NC = new TH2D("hTrackLikePlanes_2D_NC","hTrackLikePlanes_2D_NC",60,xemu,60,xemu);
01913     hTrackLikePlanes_2D_CC->SetMarkerColor(2);
01914     hTrackLikePlanes_2D_NC->SetMarkerColor(4);
01915 
01916     hTrackPlanes_2D_CC_1 = new TH1D("hTrackPlanes_2D_CC_1","hTrackPlanes_2D_CC_1",60,xemu);
01917     hTrackPlanes_2D_NC_1 = new TH1D("hTrackPlanes_2D_NC_1","hTrackPlanes_2D_NC_1",60,xemu);
01918     hTrackPlanes_2D_CC_1->SetLineColor(2);
01919     hTrackPlanes_2D_CC_1->SetLineWidth(2);
01920     hTrackPlanes_2D_NC_1->SetLineColor(4);
01921     hTrackPlanes_2D_NC_1->SetLineWidth(2);
01922 
01923     hTrackPlanes_2D_CC_2 = new TH1D("hTrackPlanes_2D_CC_2","hTrackPlanes_2D_CC_2",60,xemu);
01924     hTrackPlanes_2D_NC_2 = new TH1D("hTrackPlanes_2D_NC_2","hTrackPlanes_2D_NC_2",60,xemu);
01925     hTrackPlanes_2D_CC_2->SetLineColor(2);
01926     hTrackPlanes_2D_CC_2->SetLineWidth(2);
01927     hTrackPlanes_2D_NC_2->SetLineColor(4);
01928     hTrackPlanes_2D_NC_2->SetLineWidth(2);
01929 
01930     delete [] xcos;
01931     delete [] xph;
01932     delete [] xqp;
01933     delete [] xtrk;
01934     delete [] xevt;
01935     delete [] xenu;
01936     delete [] xemu;
01937     delete [] xemu2;
01938     delete [] xph2;
01939     delete [] xqp2;
01940 
01941     fFoundPdfs = 1;
01942   }
01943 }
01944 
01945 void MadAbID::MakePidVariables(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
01946 {
01947   // check for new run/snarl/event 
01948   // ============================= 
01949 
01950   const RecCandHeader* ntpHeader = &(ntpRecord->GetHeader());
01951   VldContext vldc = ntpHeader->GetVldContext();
01952   
01953   Int_t newRun = ntpHeader->GetRun();
01954   Int_t newSnarl = ntpHeader->GetSnarl(); 
01955   Int_t newEvent = ntpEvent->index;
01956 
01957   if( newRun==PidRun 
01958    && newSnarl==PidSnarl 
01959    && newEvent==PidEvent ){
01960     return;
01961   }
01962 
01963   // calculate PID variables
01964   // =======================
01965 
01966   MSG("MadAb",Msg::kDebug) << " *** MadAbPid::MakePidVariables(...) *** " << endl;  
01967   MSG("MadAb",Msg::kDebug) << "  Run=" << newRun << " Snarl=" << newSnarl << " Event=" << newEvent << endl; 
01968 
01969   PidRun = newRun;
01970   PidSnarl = newSnarl;
01971   PidEvent = newEvent;
01972 
01973   MSG("MadAb",Msg::kVerbose) << endl
01974     << " PID ANALYSIS MODE: " << endl
01975     << "  CosTheta: [" << fCosTheta_1D << "," << fCosTheta_2D << "]" << endl
01976     << "  X: [" << fX_1D << "," << fX_2D << "]" << endl
01977     << "  Y: [" << fY_1D << "," << fY_2D << "]" << endl
01978     << "  Q2: [" << fQ2_1D << "," << fQ2_2D << "]" << endl 
01979     << "  W2: [" << fW2_1D << "," << fW2_2D << "]" << endl
01980     << "  TrackPHfrac: [" << fTrackPHfrac_1D << "," << fTrackPHfrac_2D << "]" << endl
01981     << "  TrackPHmean: [" << fTrackPHmean_1D << "," << fTrackPHmean_2D << "]" << endl
01982     << "  TrackQPsigmaQP: [" << fTrackQPsigmaQP_1D << "," << fTrackQPsigmaQP_2D << "]" << endl
01983     << "  TrackLikePlanes: [" << fTrackLikePlanes_1D << "," << fTrackLikePlanes_2D << "]" << endl
01984     << "  TrackCharge: [" << fTrackCharge_1D << "]" << endl
01985     << "  TrackEnergy: [" << fTrackEnergy_1D << "]" << endl
01986     << "  EventEnergy: [" << fEventEnergy_1D << "]" << endl
01987     << "  Normalization: [" << fNormalization << "]" << endl;
01988 
01989   // get PDF histograms
01990   // ==================
01991   if( !fFoundPdfs ) this->MakePDFs();
01992 
01993   // calculate PID
01994   // =============
01995   PIDPASSFAIL = 0; 
01996   PROBCC = 0.0;
01997   PROBNC = 0.0;
01998   PID = -10.0; // (historical default value)
01999 
02000   PID_COSTHETA_PROBCC = 0.0;
02001   PID_X_PROBCC = 0.0;
02002   PID_Y_PROBCC = 0.0;
02003   PID_Q2_PROBCC = 0.0;
02004   PID_W2_PROBCC = 0.0;
02005   PID_TRACKPHFRAC_PROBCC = 0.0;
02006   PID_TRACKPHMEAN_PROBCC = 0.0;
02007   PID_TRACKQPSIGMAQP_PROBCC = 0.0;
02008   PID_TRACKLIKEPLANES_PROBCC = 0.0;
02009   PID_TRACKCHARGE_PROBCC = 0.0;
02010   PID_TRACKENERGY_PROBCC = 0.0;
02011   PID_EVENTENERGY_PROBCC = 0.0;
02012   PID_NORMALIZATION_PROBCC = 0.0;
02013 
02014   PID_COSTHETA_PROBNC = 0.0;
02015   PID_X_PROBNC = 0.0;
02016   PID_Y_PROBNC = 0.0;
02017   PID_Q2_PROBNC = 0.0;
02018   PID_W2_PROBNC = 0.0;
02019   PID_TRACKPHFRAC_PROBNC = 0.0;
02020   PID_TRACKPHMEAN_PROBNC = 0.0;
02021   PID_TRACKQPSIGMAQP_PROBNC = 0.0;
02022   PID_TRACKLIKEPLANES_PROBNC = 0.0;
02023   PID_TRACKCHARGE_PROBNC = 0.0;
02024   PID_TRACKENERGY_PROBNC = 0.0;
02025   PID_EVENTENERGY_PROBNC = 0.0;
02026   PID_NORMALIZATION_PROBNC = 0.0;
02027 
02028   if( fFoundPdfs ){
02029 
02030     // calculate Reco variables
02031     // ========================
02032     this->MakeRecoVariables(ntpEvent,ntpRecord);
02033   
02034     Double_t var = 0.0;
02035     Double_t probmin = 0.0;
02036     Double_t probcc = 0.0;
02037     Double_t probnc = 0.0;
02038     Double_t probCC = -999.9;
02039     Double_t probNC = -999.9;
02040     Double_t tempprobCC = 0.0;
02041     Double_t tempprobNC = 0.0;
02042 
02043     // reco CosTheta (1D)
02044     // ==================
02045     if( fCosTheta_1D ){
02046       probcc = 0.0; probnc = 0.0;
02047       if( TRKplanes>0 ){
02048         var = RECOdircosneu;
02049         probcc = hCosTheta_1D_CC->GetBinContent(hCosTheta_1D_CC->FindBin(var));
02050         probnc = hCosTheta_1D_NC->GetBinContent(hCosTheta_1D_NC->FindBin(var));
02051       }
02052       if( probcc>probmin || probnc>probmin ){
02053         if( probCC<0.0 ) probCC = 1.0;
02054         if( probNC<0.0 ) probNC = 1.0;
02055         probCC *= probcc; probNC *= probnc;
02056         PID_COSTHETA_PROBCC = probcc; PID_COSTHETA_PROBNC = probnc; 
02057       }
02058       MSG("MadAb",Msg::kVerbose) << "  CosTheta_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02059     }
02060 
02061     // reco X (1D)
02062     // =========== 
02063     if( fX_1D ){
02064       probcc = 0.0; probnc = 0.0;
02065       if( TRKplanes>0 ){
02066         var = RECOx;
02067         probcc = hX_1D_CC->GetBinContent(hX_1D_CC->FindBin(var));
02068         probnc = hX_1D_NC->GetBinContent(hX_1D_NC->FindBin(var));
02069       }
02070       if( probcc>probmin || probnc>probmin ){
02071         if( probCC<0.0 ) probCC = 1.0;
02072         if( probNC<0.0 ) probNC = 1.0;
02073         probCC *= probcc; probNC *= probnc;
02074         PID_X_PROBCC = probcc; PID_X_PROBNC = probnc; 
02075       }
02076       MSG("MadAb",Msg::kVerbose) << "  X_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02077     }
02078 
02079     // reco Y (1D)
02080     // =========== 
02081     if( fY_1D ){
02082       probcc = 0.0; probnc = 0.0;
02083       if( TRKplanes>0 ){
02084         var = RECOy;
02085         probcc = hY_1D_CC->GetBinContent(hY_1D_CC->FindBin(var));
02086         probnc = hY_1D_NC->GetBinContent(hY_1D_NC->FindBin(var));
02087       }
02088       if( probcc>probmin || probnc>probmin ){
02089         if( probCC<0.0 ) probCC = 1.0;
02090         if( probNC<0.0 ) probNC = 1.0;
02091         probCC *= probcc; probNC *= probnc;
02092         PID_Y_PROBCC = probcc; PID_Y_PROBNC = probnc; 
02093       }
02094       MSG("MadAb",Msg::kVerbose) << "  Y_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02095     }
02096 
02097     // reco Q2 (1D)
02098     // ============
02099     if( fQ2_1D ){
02100       probcc = 0.0; probnc = 0.0;
02101       if( TRKplanes>0 ){
02102         var = RECOq2;
02103         probcc = hQ2_1D_CC->GetBinContent(hQ2_1D_CC->FindBin(var));
02104         probnc = hQ2_1D_NC->GetBinContent(hQ2_1D_NC->FindBin(var));
02105       }
02106       if( probcc>probmin || probnc>probmin ){
02107         if( probCC<0.0 ) probCC = 1.0;
02108         if( probNC<0.0 ) probNC = 1.0;
02109         probCC *= probcc; probNC *= probnc;
02110         PID_Q2_PROBCC = probcc; PID_Q2_PROBNC = probnc; 
02111       }
02112       MSG("MadAb",Msg::kVerbose) << "  Q2_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02113     }
02114 
02115     // reco W2 (1D)
02116     // ============
02117     if( fW2_1D ){
02118       probcc = 0.0; probnc = 0.0;
02119       if( TRKplanes>0 ){
02120         var = RECOw2;
02121         probcc = hW2_1D_CC->GetBinContent(hW2_1D_CC->FindBin(var));
02122         probnc = hW2_1D_NC->GetBinContent(hW2_1D_NC->FindBin(var));
02123       }
02124       if( probcc>probmin || probnc>probmin ){
02125         if( probCC<0.0 ) probCC = 1.0;
02126         if( probNC<0.0 ) probNC = 1.0;
02127         probCC *= probcc; probNC *= probnc;
02128         PID_W2_PROBCC = probcc; PID_W2_PROBNC = probnc; 
02129       }
02130       MSG("MadAb",Msg::kVerbose) << "  W2_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02131     }
02132   
02133     // reco CosTheta (2D)
02134     // ==================
02135     if( fCosTheta_2D ){
02136       probcc = 0.0; probnc = 0.0;
02137       if( TRKplanes>0 ){
02138         var = RECOdircosneu;
02139         if( hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu))>0.0 )
02140           probcc = hCosTheta_2D_CC->GetBinContent(hCosTheta_2D_CC->FindBin(RECOenu,var))/
02141             hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu));
02142         if( hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu))>0.0 )
02143           probnc = hCosTheta_2D_NC->GetBinContent(hCosTheta_2D_NC->FindBin(RECOenu,var))/
02144             hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu));
02145       }
02146       if( probcc>probmin || probnc>probmin ){
02147         if( probCC<0.0 ) probCC = 1.0;
02148         if( probNC<0.0 ) probNC = 1.0;
02149         probCC *= probcc; probNC *= probnc;
02150         PID_COSTHETA_PROBCC = probcc; PID_COSTHETA_PROBNC = probnc; 
02151       }
02152       MSG("MadAb",Msg::kVerbose) << "  CosTheta_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02153     }
02154 
02155     // reco X (2D)
02156     // ===========
02157     if( fX_2D ){
02158       probcc = 0.0; probnc = 0.0;
02159       if( TRKplanes>0 ){
02160         var = RECOx;
02161         if( hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu))>0.0 )
02162           probcc = hX_2D_CC->GetBinContent(hX_2D_CC->FindBin(RECOenu,var))/
02163             hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu));
02164         if( hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu))>0.0 )
02165           probnc = hX_2D_NC->GetBinContent(hX_2D_NC->FindBin(RECOenu,var))/
02166             hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu));
02167       }
02168       if( probcc>probmin || probnc>probmin ){
02169         if( probCC<0.0 ) probCC = 1.0;
02170         if( probNC<0.0 ) probNC = 1.0;
02171         probCC *= probcc; probNC *= probnc;
02172         PID_X_PROBCC = probcc; PID_X_PROBNC = probnc; 
02173       }
02174       MSG("MadAb",Msg::kVerbose) << "  X_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02175     }
02176 
02177     // reco Y (2D)
02178     // ===========
02179     if( fY_2D ){
02180       probcc = 0.0; probnc = 0.0;
02181       if( TRKplanes>0 ){
02182         var = RECOy;
02183         if( hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu))>0.0 )
02184           probcc = hY_2D_CC->GetBinContent(hY_2D_CC->FindBin(RECOenu,var))/
02185             hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu));
02186         if( hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu))>0.0 )
02187           probnc = hY_2D_NC->GetBinContent(hY_2D_NC->FindBin(RECOenu,var))/
02188             hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu));
02189       }
02190       if( probcc>probmin || probnc>probmin ){
02191         if( probCC<0.0 ) probCC = 1.0;
02192         if( probNC<0.0 ) probNC = 1.0;
02193         probCC *= probcc; probNC *= probnc;
02194         PID_Y_PROBCC = probcc; PID_Y_PROBNC = probnc; 
02195       }
02196       MSG("MadAb",Msg::kVerbose) << "  Y_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02197     }
02198 
02199     // reco Q2 (2D)
02200     // ===========
02201     if( fQ2_2D ){
02202       probcc = 0.0; probnc = 0.0;
02203       if( TRKplanes>0 ){
02204         var = RECOq2;
02205         if( hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu))>0.0 )
02206           probcc = hQ2_2D_CC->GetBinContent(hQ2_2D_CC->FindBin(RECOenu,var))/
02207             hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu));
02208         if( hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu))>0.0 )
02209           probnc = hQ2_2D_NC->GetBinContent(hQ2_2D_NC->FindBin(RECOenu,var))/
02210             hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu));
02211       }
02212       if( probcc>probmin || probnc>probmin ){
02213         if( probCC<0.0 ) probCC = 1.0;
02214         if( probNC<0.0 ) probNC = 1.0;
02215         probCC *= probcc; probNC *= probnc;
02216         PID_Q2_PROBCC = probcc; PID_Q2_PROBNC = probnc; 
02217       } 
02218       MSG("MadAb",Msg::kVerbose) << "  Q2_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02219     }
02220   
02221     // reco W2 (2D)
02222     // ===========
02223     if( fW2_2D ){
02224       probcc = 0.0; probnc = 0.0;
02225       if( TRKplanes>0 ){
02226         var = RECOw2;
02227         if( hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu))>0.0 )
02228           probcc = hW2_2D_CC->GetBinContent(hQ2_2D_CC->FindBin(RECOenu,var))/
02229             hE_2D_CC->GetBinContent(hE_2D_CC->FindBin(RECOenu));
02230         if( hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu))>0.0 )
02231           probnc = hW2_2D_NC->GetBinContent(hQ2_2D_NC->FindBin(RECOenu,var))/
02232             hE_2D_NC->GetBinContent(hE_2D_NC->FindBin(RECOenu));
02233       }
02234       if( probcc>probmin || probnc>probmin ){
02235         if( probCC<0.0 ) probCC = 1.0;
02236         if( probNC<0.0 ) probNC = 1.0;
02237         probCC *= probcc; probNC *= probnc;
02238         PID_W2_PROBCC = probcc; PID_W2_PROBNC = probnc; 
02239       }
02240       MSG("MadAb",Msg::kVerbose) << "  W2_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02241     }
02242 
02243     // fractional pulse height (1D)
02244     // ============================
02245     if( fTrackPHfrac_1D ){
02246       probcc = 0.0; probnc = 0.0;
02247       if( TRKplanes>0 ){
02248         var = TRKtotph/RECOtotph;
02249         probcc = hTrackPHfrac_1D_CC->GetBinContent(hTrackPHfrac_1D_CC->FindBin(var));
02250         probnc = hTrackPHfrac_1D_NC->GetBinContent(hTrackPHfrac_1D_NC->FindBin(var));
02251       }
02252       if( probcc>probmin || probnc>probmin ){
02253         if( probCC<0.0 ) probCC = 1.0;
02254         if( probNC<0.0 ) probNC = 1.0;
02255         probCC *= probcc; probNC *= probnc;
02256         PID_TRACKPHFRAC_PROBCC = probcc; PID_TRACKPHFRAC_PROBNC = probnc; 
02257       }
02258       MSG("MadAb",Msg::kVerbose) << "  TrackPHfrac_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02259     }
02260 
02261     // average pulse height (1D)
02262     // =========================
02263     if( fTrackPHmean_1D ){
02264       probcc = 0.0; probnc = 0.0;
02265       if( TRKplanes>0 ){
02266         if( TRKtrackplanes>2 ) var = TRKtrkph/TRKtrackplanes;
02267         else var = TRKtotph/TRKplanes;
02268         probcc = hTrackPHmean_1D_CC->GetBinContent(hTrackPHmean_1D_CC->FindBin(var)); 
02269         probnc = hTrackPHmean_1D_NC->GetBinContent(hTrackPHmean_1D_NC->FindBin(var));
02270       }
02271       if( probcc>probmin || probnc>probmin ){
02272         if( probCC<0.0 ) probCC = 1.0;
02273         if( probNC<0.0 ) probNC = 1.0;
02274         probCC *= probcc; probNC *= probnc;
02275         PID_TRACKPHMEAN_PROBCC = probcc; PID_TRACKPHMEAN_PROBNC = probnc; 
02276       }
02277       MSG("MadAb",Msg::kVerbose) << "  TrackPHmean_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02278     }
02279 
02280     // track fit error (1D)
02281     // ====================
02282     if( fTrackQPsigmaQP_1D ){
02283       probcc = 0.0; probnc = 0.0;
02284       if( TRKplanes>0 ){
02285         var = fabs(TRKFITqpsigmaqp);
02286         probcc = hTrackQPsigmaQP_1D_CC->GetBinContent(hTrackQPsigmaQP_1D_CC->FindBin(var));
02287         probnc = hTrackQPsigmaQP_1D_NC->GetBinContent(hTrackQPsigmaQP_1D_NC->FindBin(var));
02288       }
02289       if( probcc>probmin || probnc>probmin ){
02290         if( probCC<0.0 ) probCC = 1.0;
02291         if( probNC<0.0 ) probNC = 1.0;
02292         probCC *= probcc; probNC *= probnc;
02293         PID_TRACKQPSIGMAQP_PROBCC = probcc; PID_TRACKQPSIGMAQP_PROBNC = probnc; 
02294       }
02295       MSG("MadAb",Msg::kVerbose) << "  QPsigmaQP_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02296     }
02297 
02298     // track-like planes(1D)
02299     // =====================
02300     if( fTrackLikePlanes_1D ){
02301       probcc = 0.0; probnc = 0.0;
02302       if( TRKplanes>0 ){
02303         var = TRKtrackplanes;
02304         probcc = hTrackLikePlanes_1D_CC->GetBinContent(hTrackLikePlanes_1D_CC->FindBin(var));
02305         probnc = hTrackLikePlanes_1D_NC->GetBinContent(hTrackLikePlanes_1D_NC->FindBin(var));
02306       }
02307       if( probcc>probmin || probnc>probmin ){
02308         if( probCC<0.0 ) probCC = 1.0;
02309         if( probNC<0.0 ) probNC = 1.0;
02310         probCC *= probcc; probNC *= probnc;
02311         PID_TRACKLIKEPLANES_PROBCC = probcc; PID_TRACKLIKEPLANES_PROBNC = probnc; 
02312       }
02313       MSG("MadAb",Msg::kVerbose) << "  TrackLikePlanes_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02314     }
02315 
02316     // fractional pulse height (2D)
02317     // ============================
02318     if( fTrackPHfrac_2D ){
02319       probcc = 0.0; probnc = 0.0;
02320       if( TRKplanes>0.0 ){
02321         var = TRKtotph/RECOtotph; 
02322         if( hTrackPlanes_2D_CC_2->GetBinContent(hTrackPlanes_2D_CC_2->FindBin(TRKplanes))>0.0 )
02323           probcc = hTrackPHfrac_2D_CC->GetBinContent(hTrackPHfrac_2D_CC->FindBin(TRKplanes,var))/
02324             hTrackPlanes_2D_CC_2->GetBinContent(hTrackPlanes_2D_CC_2->FindBin(TRKplanes));
02325         if( hTrackPlanes_2D_NC_2->GetBinContent(hTrackPlanes_2D_NC_2->FindBin(TRKplanes))>0.0 )
02326           probnc = hTrackPHfrac_2D_NC->GetBinContent(hTrackPHfrac_2D_NC->FindBin(TRKplanes,var))/
02327             hTrackPlanes_2D_NC_2->GetBinContent(hTrackPlanes_2D_NC_2->FindBin(TRKplanes));
02328       }
02329       if( probcc>probmin || probnc>probmin ){
02330         if( probCC<0.0 ) probCC = 1.0;
02331         if( probNC<0.0 ) probNC = 1.0;
02332         probCC *= probcc; probNC *= probnc;
02333         PID_TRACKPHFRAC_PROBCC = probcc; PID_TRACKPHFRAC_PROBNC = probnc; 
02334       }
02335       MSG("MadAb",Msg::kVerbose) << "  TrackPHfrac_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02336     }
02337 
02338     // average pulse height (2D)
02339     // =========================
02340     if( fTrackPHmean_2D ){
02341       probcc = 0.0; probnc = 0.0;
02342       if( TRKplanes>0 ){
02343         if( TRKtrackplanes>2 ) var = TRKtrkph/TRKtrackplanes;
02344         else var = TRKtotph/TRKplanes;
02345         if( hTrackPlanes_2D_CC_2->GetBinContent(hTrackPlanes_2D_CC_2->FindBin(TRKplanes))>0.0 )
02346           probcc = hTrackPHmean_2D_CC->GetBinContent(hTrackPHmean_2D_CC->FindBin(TRKplanes,var))/
02347             hTrackPlanes_2D_CC_2->GetBinContent(hTrackPlanes_2D_CC_2->FindBin(TRKplanes));
02348         if( hTrackPlanes_2D_NC_2->GetBinContent(hTrackPlanes_2D_NC_2->FindBin(TRKplanes))>0.0 )
02349           probnc = hTrackPHmean_2D_NC->GetBinContent(hTrackPHmean_2D_NC->FindBin(TRKplanes,var))/
02350             hTrackPlanes_2D_NC_2->GetBinContent(hTrackPlanes_2D_NC_2->FindBin(TRKplanes));
02351       }
02352       if( probcc>probmin || probnc>probmin ){
02353         if( probCC<0.0 ) probCC = 1.0;
02354         if( probNC<0.0 ) probNC = 1.0;
02355         probCC *= probcc; probNC *= probnc;
02356         PID_TRACKPHMEAN_PROBCC = probcc; PID_TRACKPHMEAN_PROBNC = probnc; 
02357       }
02358       MSG("MadAb",Msg::kVerbose) << "  TrackPHmean_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02359     }
02360 
02361     // track fit error (2D)
02362     // ====================
02363     if( fTrackQPsigmaQP_2D ){
02364       probcc = 0.0; probnc = 0.0;
02365       if( TRKplanes>0 ){
02366         var = fabs(TRKFITqpsigmaqp);
02367         if( hTrackPlanes_2D_CC_2->GetBinContent(hTrackPlanes_2D_CC_2->FindBin(TRKplanes))>0.0 )
02368           probcc = hTrackQPsigmaQP_2D_CC->GetBinContent(hTrackQPsigmaQP_2D_CC->FindBin(TRKplanes,var))/
02369             hTrackPlanes_2D_CC_2->GetBinContent(hTrackPlanes_2D_CC_2->FindBin(TRKplanes));
02370         if( hTrackPlanes_2D_NC_2->GetBinContent(hTrackPlanes_2D_NC_2->FindBin(TRKplanes))>0.0 )
02371           probnc = hTrackQPsigmaQP_2D_NC->GetBinContent(hTrackQPsigmaQP_2D_NC->FindBin(TRKplanes,var))/
02372             hTrackPlanes_2D_NC_2->GetBinContent(hTrackPlanes_2D_NC_2->FindBin(TRKplanes));
02373       }
02374       if( probcc>probmin || probnc>probmin ){
02375         if( probCC<0.0 ) probCC = 1.0;
02376         if( probNC<0.0 ) probNC = 1.0;
02377         probCC *= probcc; probNC *= probnc;
02378         PID_TRACKQPSIGMAQP_PROBCC = probcc; PID_TRACKQPSIGMAQP_PROBNC = probnc;
02379       }
02380       MSG("MadAb",Msg::kVerbose) << "  QPsigmaQP_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02381     }
02382 
02383     // track-like planes(2D)
02384     // =====================
02385     if( fTrackLikePlanes_2D ){
02386       probcc = 0.0; probnc = 0.0;
02387       if( TRKplanes>0 ){
02388         var = TRKtrackplanes;
02389         if( hTrackPlanes_2D_CC_1->GetBinContent(hTrackPlanes_2D_CC_1->FindBin(TRKplanes))>0.0 )
02390           probcc = hTrackLikePlanes_2D_CC->GetBinContent(hTrackLikePlanes_2D_CC->FindBin(TRKplanes,var))/
02391             hTrackPlanes_2D_CC_1->GetBinContent(hTrackPlanes_2D_CC_1->FindBin(TRKplanes));
02392         if( hTrackPlanes_2D_NC_1->GetBinContent(hTrackPlanes_2D_NC_1->FindBin(TRKplanes))>0.0 )
02393           probnc = hTrackLikePlanes_2D_NC->GetBinContent(hTrackLikePlanes_2D_NC->FindBin(TRKplanes,var))/
02394             hTrackPlanes_2D_NC_1->GetBinContent(hTrackPlanes_2D_NC_1->FindBin(TRKplanes));
02395       }
02396       if( probcc>probmin || probnc>probmin ){
02397         if( probCC<0.0 ) probCC = 1.0;
02398         if( probNC<0.0 ) probNC = 1.0;
02399         probCC *= probcc; probNC *= probnc;
02400         PID_TRACKLIKEPLANES_PROBCC = probcc; PID_TRACKLIKEPLANES_PROBNC = probnc; 
02401       }
02402       MSG("MadAb",Msg::kVerbose) << "  TrackLikePlanes_2D: pCC=" << probcc << " pNC=" << probnc << endl;
02403     }
02404 
02405     // track charge (1D)
02406     // =================
02407     if( fTrackCharge_1D ){
02408       probcc = 0.0; probnc = 0.0;
02409       if( TRKplanes>0 ){
02410         var = TRKFITemcharge;
02411         probcc = hTrackCharge_1D_CC->GetBinContent(hTrackCharge_1D_CC->FindBin(var));
02412         probnc = hTrackCharge_1D_NC->GetBinContent(hTrackCharge_1D_NC->FindBin(var));
02413       }
02414       if( probcc>probmin || probnc>probmin ){
02415         if( probCC<0.0 ) probCC = 1.0;
02416         if( probNC<0.0 ) probNC = 1.0;
02417         probCC *= probcc; probNC *= probnc;
02418         PID_TRACKCHARGE_PROBCC = probcc; PID_TRACKCHARGE_PROBNC = probnc; 
02419       }
02420       MSG("MadAb",Msg::kVerbose) << "  TrackCharge_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02421     }
02422 
02423     // track energy (1D)
02424     // =================
02425     if( fTrackEnergy_1D ){
02426       probcc = 0.0; probnc = 0.0;
02427       if( TRKplanes>0 ){
02428         probcc = hTrackEnergy_1D_CC->GetBinContent(hTrackEnergy_1D_CC->FindBin(TRKspanplanes));
02429         probnc = hTrackEnergy_1D_NC->GetBinContent(hTrackEnergy_1D_NC->FindBin(TRKspanplanes));
02430       }
02431       if( probcc>probmin || probnc>probmin ){
02432         if( probCC<0.0 ) probCC = 1.0;
02433         if( probNC<0.0 ) probNC = 1.0;
02434         probCC *= probcc; probNC *= probnc;
02435         PID_TRACKENERGY_PROBCC = probcc; PID_TRACKENERGY_PROBNC = probnc;
02436       }
02437       MSG("MadAb",Msg::kVerbose) << "  TrackEnergy_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02438     }
02439   
02440     // event energy (1D)
02441     // =================
02442     if( fEventEnergy_1D ){
02443       probcc = 0.0; probnc = 0.0;
02444       if( TRKplanes>0 ){
02445         probcc = hEventEnergy_1D_CC->GetBinContent(hEventEnergy_1D_CC->FindBin(RECOenu));
02446         probnc = hEventEnergy_1D_NC->GetBinContent(hEventEnergy_1D_NC->FindBin(RECOenu));
02447       }
02448       if( probcc>probmin || probnc>probmin ){
02449         if( probCC<0.0 ) probCC = 1.0;
02450         if( probNC<0.0 ) probNC = 1.0;
02451         probCC *= probcc; probNC *= probnc;
02452         PID_EVENTENERGY_PROBCC = probcc; PID_EVENTENERGY_PROBNC = probnc;
02453       }
02454       MSG("MadAb",Msg::kVerbose) << "  EventEnergy_1D: pCC=" << probcc << " pNC=" << probnc << endl;
02455     }
02456 
02457     // CC/NC normalization
02458     // ===================
02459     if( fNormalization ){
02460       probcc = 0.0; probnc = 0.0;
02461       if( TRKplanes>0 ){
02462         probcc = hNormalization->GetBinContent(hNormalization->FindBin(1));
02463         probnc = hNormalization->GetBinContent(hNormalization->FindBin(0));
02464       }
02465       if( probcc>probmin || probnc>probmin ){
02466         if( probCC<0.0 ) probCC = 1.0;
02467         if( probNC<0.0 ) probNC = 1.0;
02468         probCC *= probcc; probNC *= probnc;
02469         PID_NORMALIZATION_PROBCC = probcc; PID_NORMALIZATION_PROBNC = probnc;
02470       }
02471       MSG("MadAb",Msg::kVerbose) << "  Normalization: pCC=" << probcc << " pNC=" << probnc << endl;
02472     }
02473 
02474     // Overall probability
02475     // ===================
02476     if( probCC>=0 && probNC>=0 ){
02477       if( probCC+probNC>1.0 ){
02478         tempprobCC = (probCC)/(probCC+probNC);
02479         tempprobNC = (probNC)/(probCC+probNC);
02480         probCC = tempprobCC; probNC = tempprobNC;
02481       }
02482       PROBCC = probCC; PROBNC = probNC;
02483     }
02484 
02485     MSG("MadAb",Msg::kVerbose) << " Overall: pCC=" << PROBCC << " pNC=" << PROBNC << endl;
02486     
02487     // PID
02488     // ===
02489     if( PROBCC+PROBNC>0.0 ){
02490       PID = PROBCC/(PROBCC+PROBNC);
02491       PIDPASSFAIL = 1;
02492     }
02493   }
02494 
02495   MSG("MadAb",Msg::kDebug) << " PASSFAIL = " << PIDPASSFAIL << endl;
02496   MSG("MadAb",Msg::kDebug) << " PID = " << PID << endl;
02497 
02498   MSG("MadAb",Msg::kVerbose) << " *** MadAbID::MakePidVariables(...) FINISHED *** " << endl;
02499 
02500 }
02501 
02502 void MadAbID::MakeRecoVariables(const NtpSREvent* ntpEvent, const NtpStRecord* ntpRecord)
02503 {
02504   // check for new run/snarl/event 
02505   // ============================= 
02506 
02507   const RecCandHeader* ntpHeader = &(ntpRecord->GetHeader());
02508   VldContext vldc = ntpHeader->GetVldContext();
02509   
02510   Int_t newRun = ntpHeader->GetRun();
02511   Int_t newSnarl = ntpHeader->GetSnarl(); 
02512   Int_t newEvent = ntpEvent->index;
02513 
02514   if( newRun==RecoRun 
02515    && newSnarl==RecoSnarl 
02516    && newEvent==RecoEvent ){
02517     return;
02518   }
02519 
02520   // calculate Reco variables
02521   // ========================
02522 
02523   MSG("MadAb",Msg::kDebug) << " *** MadAbPid::MakeRecoVariables(...) *** " << endl;  
02524   MSG("MadAb",Msg::kDebug) << "  Run=" << newRun << " Snarl=" << newSnarl << " Event=" << newEvent << endl; 
02525 
02526   RecoRun = newRun;
02527   RecoSnarl = newSnarl;
02528   RecoEvent = newEvent;
02529 
02530   Ndigits = 0;
02531   Nstrips = 0;
02532   Ntracks = 0;
02533   Nshowers = 0;
02534   RECOminplane = -999;
02535   RECOmaxplane = -999;
02536   RECOtotph = 0.0;
02537 
02538   RECOenu = 0.0;
02539   RECOemu = 0.0;
02540   RECOehad = 0.0;
02541   RECOx = 0.0;
02542   RECOy = 0.0;
02543   RECOq2 = 0.0;
02544   RECOw2 = 0.0;
02545   RECOdircosU = 0.0;
02546   RECOdircosV = 0.0;
02547   RECOdircosX = 0.0;
02548   RECOdircosY = 0.0;
02549   RECOdircosZ = 0.0;
02550   RECOdircosneu = 0.0;
02551   RECOQEenu = 0.0;
02552   RECOQEemu = 0.0;
02553   RECOQEehad = 0.0;
02554   RECOQEx = 0.0;
02555   RECOQEy = 0.0;
02556   RECOQEq2 = 0.0;
02557   RECOQEw2 = 0.0;
02558   RECOvtxplane = -999;
02559   RECOvtxU = -999.9;
02560   RECOvtxV = -999.9;
02561   RECOvtxX = -999.9;
02562   RECOvtxY = -999.9;
02563   RECOvtxR = -999.9;
02564   RECOvtxZ = -999.9;
02565   RECOvtxDistToEdge = -999.9;
02566   RECOvtxDistToEndBack = -999.9;
02567   RECOvtxDistToEndForward = -999.9;
02568   RECOcontained = 0;
02569   RECOvtxcontained = 0;
02570   RECOendcontained = 0;
02571 
02572   TRKvtxplane = -999;
02573   TRKvtxU = -999.9;
02574   TRKvtxV = -999.9;
02575   TRKvtxX = -999.9;
02576   TRKvtxY = -999.9;
02577   TRKvtxR = -999.9;
02578   TRKvtxZ = -999.9;
02579   TRKvtxdircosU = 0.0;
02580   TRKvtxdircosV = 0.0;
02581   TRKvtxdircosX = 0.0;
02582   TRKvtxdircosY = 0.0;
02583   TRKvtxdircosZ = 0.0;
02584   TRKvtxDistToEdge = -999.9;
02585   TRKvtxDistToEndBack = -999.9;
02586   TRKvtxDistToEndForward = -999.9;
02587   TRKvtxtrace = -999.9;
02588   TRKvtxtraceZ = -999.9;
02589   TRKendplane = -999;
02590   TRKendU = -999.9;
02591   TRKendV = -999.9; 
02592   TRKendX = -999.9;
02593   TRKendY = -999.9; 
02594   TRKendR = -999.9; 
02595   TRKendZ = -999.9;
02596   TRKenddircosU = 0.0;
02597   TRKenddircosV = 0.0;
02598   TRKenddircosX = 0.0;
02599   TRKenddircosY = 0.0;
02600   TRKenddircosZ = 0.0;
02601   TRKendDistToEdge = -999.9;
02602   TRKendDistToEndBack = -999.9;
02603   TRKendDistToEndForward = -999.9;
02604   TRKendtrace = -999.9;
02605   TRKendtraceZ = -999.9;
02606   TRKstrips = 0;
02607   TRKplanes = 0;
02608   TRKtotph = 0.0;
02609   TRKtrkph = 0.0;
02610   TRKshwph = 0.0;
02611   TRKspanplanes = 0;
02612   TRKtrackplanes = 0;
02613   TRKshowerplanes = 0;
02614   TRKtracklikeplanes = 0;
02615   TRKshowerlikeplanes = 0;
02616   TRKcontained = 0;
02617   TRKmomentumRange = 0.0;
02618   TRKmomentumCurve = 0.0;
02619   TRKforwardRMS = 0.0;
02620   TRKforwardNDOF = 0;
02621   TRKbackwardRMS = 0.0;
02622   TRKbackwardNDOF = 0; 
02623   TRKFITchi2 = -999.9;
02624   TRKFITndof = 0;
02625   TRKFITpass = 0;
02626   TRKFITqpsigmaqp = 0.0;
02627   TRKFITemcharge = 0;
02628 
02629   SHWenergy = 0.0;
02630   SHWcontained = 0;
02631 
02632   if( ntpRecord ){
02633 
02634     // INITIALIZATION
02635     // ==============
02636     const RecCandHeader* ntpHeader = &(ntpRecord->GetHeader());
02637     VldContext vldc = ntpHeader->GetVldContext();
02638 
02639     TClonesArray* stripArray = (TClonesArray*)(ntpRecord->stp);
02640     TClonesArray* showerArray = (TClonesArray*)(ntpRecord->shw);
02641     TClonesArray* trackArray = (TClonesArray*)(ntpRecord->trk);
02642 
02643     Ndigits = 0;
02644     Nstrips = 0;
02645     Ntracks = 0;
02646     Nshowers = 0;
02647 
02648     Int_t ctr = 0;
02649     Int_t last = 1+stripArray->GetLast();
02650 
02651     Int_t* flag = new Int_t[500];
02652     Int_t* shwflag = new Int_t[last];
02653     Int_t* trkflag = new Int_t[last];
02654 
02655     for( Int_t n=0; n<last; n++ ){
02656       shwflag[n]=0;
02657       trkflag[n]=0;
02658     }
02659 
02660     for( Int_t n=0; n<500; n++ ){
02661       flag[n]=0;
02662       fStripList[n].Clear();
02663       fTrackStripList[n].Clear();
02664       fTrkShowerStripList[n].Clear();
02665       fShwShowerStripList[n].Clear();
02666     }
02667 
02668     // LOW LEVEL VARIABLES
02669     // ===================
02670     Double_t temp,dr,dzm,dzp;
02671     RECOminplane = -999;
02672     RECOmaxplane = -999;
02673     RECOtotph = 0.0;
02674 
02675     // get strips in event
02676     ctr = 0;
02677     Int_t* evtstp = ntpEvent->stp;
02678     for( Int_t k=0; k<ntpEvent->nstrip; k++ ){
02679       Int_t sptr = evtstp[k];
02680       if( sptr>=0 ){
02681         NtpSRStrip* strip = (NtpSRStrip*)(stripArray->At(sptr));
02682         Int_t plane = strip->plane;
02683         if( plane>=0 && plane<500 ){
02684           fStripList[plane].Add(strip); 
02685           if( RECOminplane<0 || plane<RECOminplane ) RECOminplane=plane;
02686           if( RECOmaxplane<0 || plane>RECOmaxplane ) RECOmaxplane=plane;
02687           RECOtotph += strip->ph0.sigcor+strip->ph1.sigcor; 
02688           Ndigits += strip->ndigit;
02689           Nstrips++;
02690           ctr++;
02691         }
02692       }
02693     }
02694     MSG("MadAb",Msg::kDebug) << "   found " << ctr << " strips *** " << endl;
02695 
02696     // EVENT VERTEX
02697     // ============
02698     NtpSRVertex vertex = ntpEvent->vtx;
02699     RECOvtxplane = vertex.plane;
02700     RECOvtxU = vertex.u;
02701     RECOvtxV = vertex.v;
02702     RECOvtxX = vertex.x;
02703     RECOvtxY = vertex.y;
02704     RECOvtxZ = vertex.z;
02705 
02706     // RECONSTRUCTED TRACKS
02707     // ====================
02708     Ntracks = ntpEvent->ntrack;
02709 
02710     if( ntpEvent->ntrack>0 ){
02711       MSG("MadAb",Msg::kDebug) << "   found reconstructed track(s) *** " << endl;
02712 
02713       // get primary track
02714       // Int_t trkptr = ntpEvent->primtrk;
02715       // if( trkptr>ntpEvent->ntrack ) trkptr=0; 
02716               
02717       // get longest track
02718       Int_t trkptr = -1;
02719       Int_t trackplanes = 0;
02720       Int_t* trk = ntpEvent->trk;
02721       for( Int_t n=0; n<ntpEvent->ntrack; n++ ){
02722         Int_t ptr=trk[n];
02723         if( ptr>=0 ){
02724           NtpSRTrack* track = (NtpSRTrack*)(trackArray->At(ptr));
02725           if( abs(track->end.plane-track->vtx.plane)>trackplanes ){
02726             trackplanes=abs(track->end.plane-track->vtx.plane);
02727             trkptr=ptr;
02728           }
02729         }
02730       }
02731 
02732       // load longest track
02733       if( trkptr>=0 ){
02734         NtpSRTrack* track = (NtpSRTrack*)(trackArray->At(trkptr));
02735 
02736         Double_t p = track->momentum.range;
02737         Double_t qp = track->momentum.qp;
02738         Double_t eqp = track->momentum.eqp;
02739         Double_t chi2 = track->fit.chi2;
02740         Int_t ndof = track->fit.ndof; 
02741         Int_t pass = track->fit.pass;
02742         if( qp==0.0 || eqp==0.0 || ndof<=1 ) pass = 0;
02743 
02744         TRKmomentumRange = p;
02745         if( qp!=0.0 ) TRKmomentumCurve = fabs(1/qp);
02746         TRKFITchi2 = chi2;
02747         TRKFITndof = ndof;
02748         TRKFITpass = pass;
02749         if( pass ) TRKFITqpsigmaqp = qp/eqp;
02750         if( pass ) TRKFITemcharge = (Int_t)(qp/fabs(qp));
02751           
02752         TRKvtxplane = track->vtx.plane;
02753         TRKvtxU = track->vtx.u;
02754         TRKvtxV = track->vtx.v;
02755         TRKvtxX = track->vtx.x;
02756         TRKvtxY = track->vtx.y; 
02757         TRKvtxZ = track->vtx.z;
02758 
02759         if( vldc.GetDetector()==Detector::kFar ){
02760           TRKvtxR = sqrt(TRKvtxX*TRKvtxX+TRKvtxY*TRKvtxY);
02761         }
02762         if( vldc.GetDetector()==Detector::kNear ){
02763           TRKvtxR = sqrt( (TRKvtxX-1.4828)*(TRKvtxX-1.4828)
02764                         + (TRKvtxY-0.2384)*(TRKvtxY-0.2384) );
02765         }
02766            
02767         TRKvtxdircosU = track->vtx.dcosu;
02768         TRKvtxdircosV = track->vtx.dcosv;
02769         TRKvtxdircosX = track->vtx.dcosx;
02770         TRKvtxdircosY = track->vtx.dcosy;
02771         TRKvtxdircosZ = track->vtx.dcosz;
02772 
02773         TRKendplane = track->end.plane;
02774         TRKendU = track->end.u;
02775         TRKendV = track->end.v; 
02776         TRKendX = track->end.x;
02777         TRKendY = track->end.y;
02778         TRKendR = sqrt(TRKendX*TRKendX+TRKendY*TRKendY);
02779         TRKendZ = track->end.z; 
02780 
02781         TRKenddircosU = track->end.dcosu;
02782         TRKenddircosV = track->end.dcosv;
02783         TRKenddircosX = track->end.dcosx;
02784         TRKenddircosY = track->end.dcosy;
02785         TRKenddircosZ = track->end.dcosz; 
02786 
02787         TRKcontained = track->contained;
02788 
02789         TRKforwardRMS = track->time.forwardRMS;
02790         TRKforwardNDOF = track->time.forwardNDOF;
02791         TRKbackwardRMS = track->time.backwardRMS;
02792         TRKbackwardNDOF = track->time.backwardNDOF;   
02793 
02794         TRKstrips = 0;
02795 
02796         // get strips in track
02797         ctr = 0;
02798         Int_t* trkstp = track->stp;
02799         for( Int_t k=0; k<track->nstrip; k++ ){
02800           Int_t sptr = trkstp[k];
02801           if( sptr>=0 ){
02802             NtpSRStrip* strip = (NtpSRStrip*)(stripArray->At(sptr));
02803             Int_t plane = strip->plane;
02804             if( plane>=0 && plane<500 ){
02805               fTrackStripList[plane].Add(strip); 
02806               TRKstrips++;
02807               ctr++;
02808             }
02809             if( sptr<last ){
02810               trkflag[sptr] = 1;
02811             }
02812           }
02813         }
02814         MSG("MadAb",Msg::kDebug) << "   found " << ctr << " track strips *** " << endl;
02815  
02816         // fiducial containment in far detector
02817         if( vldc.GetDetector()==Detector::kFar ){
02818 
02819           // distance to edge/end of detector
02820           Double_t pm;
02821           Double_t gradu,gradv,grads;
02822           Double_t dU,dV,dX,dY,dR;
02823           Double_t posU,posV,posX,posY,posZ;
02824           Double_t dirU,dirV,dirX,dirY,dirZ;
02825           Double_t trace,traceZ;
02826           Int_t trkflag;
02827     
02828           // (vertex distances)
02829           Double_t vtxU = TRKvtxU;
02830           Double_t vtxV = TRKvtxV;
02831           Double_t vtxX = TRKvtxX;
02832           Double_t vtxY = TRKvtxY;
02833           Double_t vtxZ = TRKvtxZ;
02834 
02835           dr = 999.9; 
02836           temp=4.0-vtxU; if(temp<dr) dr=temp;
02837           temp=4.0+vtxU; if(temp<dr) dr=temp;
02838           temp=4.0-vtxV; if(temp<dr) dr=temp;
02839           temp=4.0+vtxV; if(temp<dr) dr=temp;
02840           temp=4.0-vtxX; if(temp<dr) dr=temp;
02841           temp=4.0+vtxX; if(temp<dr) dr=temp;
02842           temp=4.0-vtxY; if(temp<dr) dr=temp;
02843           temp=4.0+vtxY; if(temp<dr) dr=temp;
02844           if( dr<999.9 ) TRKvtxDistToEdge = dr;
02845 
02846           if( TRKvtxdircosZ>=0.0 ){
02847           if( TRKvtxplane<249 ){ dzm = vtxZ-0.110; dzp = 14.793-vtxZ; }
02848             if( TRKvtxplane>249 ){ dzm = vtxZ-15.986; dzp = 29.955-vtxZ; }
02849           }
02850           if( TRKvtxdircosZ<0.0 ){
02851             if( TRKvtxplane<249 ){ dzm = 14.793-vtxZ; dzp = vtxZ-0.110; }
02852             if( TRKvtxplane>249 ){ dzm = 29.955-vtxZ; dzp = vtxZ-15.986; }
02853           }
02854 
02855           TRKvtxDistToEndBack = dzm;
02856           TRKvtxDistToEndForward = dzp;
02857 
02858           // (vertex trace)
02859           posU=vtxU; posV=vtxV; posZ=vtxZ;
02860           posX=0.7071*(posU-posV); posY=0.7071*(posU+posV);
02861 
02862           gradu=(TRKvtxdircosU/TRKvtxdircosZ); 
02863           gradv=(TRKvtxdircosV/TRKvtxdircosZ);
02864           grads=sqrt(gradu*gradu+gradv*gradv+1.0);
02865           if(TRKvtxdircosZ>0.0) pm=-1.0; else pm=+1.0;
02866           dirU=pm*gradu/grads; dirV=pm*gradv/grads; dirZ=pm*1.0/grads;
02867           dirX=0.7071*(dirU-dirV); dirY=0.7071*(dirU+dirV);
02868           trkflag=0; dR=0.0;
02869 
02870           if(trkflag==0){
02871             if(dirX>0.0){
02872               dX = 4.0-posX; dY = dX*(dirY/dirX);
02873               if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
02874                 trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
02875               }
02876             }
02877             if(dirX<0.0){
02878               dX = 4.0+posX; dY = -dX*(dirY/dirX);
02879               if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
02880                 trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
02881               }
02882             }
02883           }
02884 
02885           if(trkflag==0){
02886             if(dirY>0.0){
02887               dY = 4.0-posY; dX = dY*(dirX/dirY);
02888               if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
02889                 trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
02890               }
02891             }
02892             if(dirY<0.0){
02893               dY = 4.0+posY; dX = -dY*(dirX/dirY);
02894               if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
02895                 trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
02896               }
02897             }
02898           }
02899 
02900           if(trkflag==0){
02901             if(dirU>0.0){
02902               dU = 4.0-posU; dV = dU*(dirV/dirU);
02903               if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
02904                 trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
02905               }
02906             }
02907             if(dirU<0.0){
02908               dU = 4.0+posU; dV = -dU*(dirV/dirU);
02909               if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
02910                 trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
02911               }
02912             }
02913           }
02914 
02915           if(trkflag==0){
02916             if(dirV>0.0){
02917               dV = 4.0-posV; dU = dV*(dirU/dirV);
02918               if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
02919                 trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
02920               }
02921             }
02922             if(dirV<0.0){
02923               dV = 4.0+posV; dU = -dV*(dirU/dirV);
02924               if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
02925                 trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
02926               }
02927             }
02928           }
02929  
02930           traceZ=0.0; trace=0.0;
02931           if(sqrt(dirX*dirX+dirY*dirY)>0.0){
02932             traceZ=(pm*dR*dirZ)/sqrt(dirX*dirX+dirY*dirY);
02933           }
02934           trace=(traceZ)/(pm*dirZ); 
02935 
02936           TRKvtxtrace = trace;
02937           TRKvtxtraceZ = traceZ;
02938 
02939           // (end distances)
02940           Double_t endU = TRKendU;
02941           Double_t endV = TRKendV;
02942           Double_t endX = TRKendX;
02943           Double_t endY = TRKendY;
02944           Double_t endZ = TRKendZ;
02945 
02946           dr = 999.9; 
02947           temp=4.0-endU; if(temp<dr) dr=temp;
02948           temp=4.0+endU; if(temp<dr) dr=temp;
02949           temp=4.0-endV; if(temp<dr) dr=temp;
02950           temp=4.0+endV; if(temp<dr) dr=temp;
02951           temp=4.0-endX; if(temp<dr) dr=temp;
02952           temp=4.0+endX; if(temp<dr) dr=temp;
02953           temp=4.0-endY; if(temp<dr) dr=temp;
02954           temp=4.0+endY; if(temp<dr) dr=temp;
02955           if( dr<999.9 ) TRKendDistToEdge = dr;
02956 
02957           if( TRKenddircosZ>0.0 ){
02958             if( TRKendplane<249 ){ dzm = endZ-0.110; dzp = 14.793-endZ; }
02959             if( TRKendplane>249 ){ dzm = endZ-15.986; dzp = 29.955-endZ; }
02960           }
02961           if( TRKenddircosZ<0.0 ){
02962             if( TRKendplane<249 ){ dzm = 14.793-endZ; dzp = endZ-0.110; }
02963             if( TRKendplane>249 ){ dzm = 29.955-endZ; dzp = endZ-15.986; }
02964           }
02965 
02966           TRKendDistToEndBack = dzm;
02967           TRKendDistToEndForward = dzp;
02968 
02969           // (end trace)
02970           posU=endU; posV=endV; posZ=endZ;
02971           posX=0.7071*(posU-posV); posY=0.7071*(posU+posV);
02972 
02973           gradu = (TRKenddircosU/TRKenddircosZ); 
02974           gradv = (TRKenddircosV/TRKenddircosZ);
02975           grads = sqrt(gradu*gradu+gradv*gradv+1.0);
02976           if(TRKenddircosZ>0.0) pm=+1.0; else pm=-1.0;
02977           dirU=pm*gradu/grads; dirV=pm*gradv/grads; dirZ=pm*1.0/grads;
02978           dirX=0.7071*(dirU-dirV); dirY=0.7071*(dirU+dirV);
02979           trkflag=0; dR=0.0;
02980 
02981           if(trkflag==0){
02982             if(dirX>0.0){
02983               dX = 4.0-posX; dY = dX*(dirY/dirX);
02984               if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
02985                 trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
02986               }
02987             }
02988             if(dirX<0.0){
02989               dX = 4.0+posX; dY = -dX*(dirY/dirX);
02990               if( posY+dY<4.0*(sqrt(2.0)-1.0) && posY+dY>-4.0*(sqrt(2.0)-1.0) ){
02991                 trkflag=1; if(dX>0.0) dR=sqrt(dX*dX+dY*dY); if(dX<0.0) dR=-sqrt(dX*dX+dY*dY);
02992               }
02993             }
02994           }
02995 
02996           if(trkflag==0){
02997             if(dirY>0.0){
02998               dY = 4.0-posY; dX = dY*(dirX/dirY);
02999               if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
03000                 trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
03001               }
03002             }
03003             if(dirY<0.0){
03004               dY = 4.0+posY; dX = -dY*(dirX/dirY);
03005               if( posX+dX<4.0*(sqrt(2.0)-1.0) && posX+dX>-4.0*(sqrt(2.0)-1.0) ){
03006                 trkflag=1; if(dY>0.0) dR=sqrt(dX*dX+dY*dY); if(dY<0.0) dR=-sqrt(dX*dX+dY*dY);
03007               }
03008             }
03009           }
03010 
03011           if(trkflag==0){
03012             if(dirU>0.0){
03013               dU = 4.0-posU; dV = dU*(dirV/dirU);
03014               if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
03015                 trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
03016               }
03017             }
03018             if(dirU<0.0){
03019               dU = 4.0+posU; dV = -dU*(dirV/dirU);
03020               if( posV+dV<4.0*(sqrt(2.0)-1.0) && posV+dV>-4.0*(sqrt(2.0)-1.0) ){
03021                 trkflag=1; if(dU>0.0) dR=sqrt(dV*dV+dU*dU); if(dU<0.0) dR=-sqrt(dV*dV+dU*dU);
03022               }
03023             }
03024           }
03025 
03026           if(trkflag==0){
03027             if(dirV>0.0){
03028               dV = 4.0-posV; dU = dV*(dirU/dirV);
03029               if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
03030                 trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
03031               }
03032             }
03033             if(dirV<0.0){
03034               dV = 4.0+posV; dU = -dV*(dirU/dirV);
03035               if( posU+dU<4.0*(sqrt(2.0)-1.0) && posU+dU>-4.0*(sqrt(2.0)-1.0) ){
03036                 trkflag=1; if(dV>0.0) dR=sqrt(dV*dV+dU*dU); if(dV<0.0) dR=-sqrt(dV*dV+dU*dU);
03037               }
03038             }
03039           }
03040  
03041           traceZ=0.0; trace=0.0;
03042           if(sqrt(dirX*dirX+dirY*dirY)>0.0){
03043             traceZ=(pm*dR*dirZ)/sqrt(dirX*dirX+dirY*dirY);
03044           }
03045           trace=(traceZ)/(pm*dirZ); 
03046           
03047           TRKendtrace = trace;
03048           TRKendtraceZ = traceZ;
03049         }
03050 
03051         // fiducial containment in near detector
03052         if( vldc.GetDetector()==Detector::kNear ){
03053           TRKvtxDistToEdge = track->fidvtx.dr;
03054           TRKvtxDistToEndBack = track->fidvtx.dz;
03055           TRKvtxDistToEndForward = track->fidvtx.dz;
03056           TRKvtxtrace = track->fidvtx.trace;
03057           TRKvtxtraceZ = track->fidvtx.tracez;
03058           TRKendDistToEdge = track->fidend.dr;
03059           TRKendDistToEndBack = track->fidend.dz;
03060           TRKendDistToEndForward = track->fidend.dz;
03061           TRKendtrace = track->fidend.trace;
03062           TRKendtraceZ = track->fidend.tracez;
03063         }
03064 
03065         // calculate track-like planes
03066         Int_t bstrp,estrp;
03067         Double_t trkph,evtph;
03068 
03069         Double_t sumtrkph = 0.0;
03070         Double_t sumevtph = 0.0;
03071         Int_t ntrackplanes = 0;
03072         Int_t ntracklikeplanes = 0;
03073         Int_t nshowerlikeplanes = 0;
03074 
03075         for( Int_t n=0; n<500; n++ ){
03076   
03077           Int_t dpln = 1;
03078           if( vldc.GetDetector()==Detector::kNear ){
03079             if( n>120 ) dpln = 5;
03080           }
03081 
03082           if( 1+fStripList[n].GetLast()>0 ){
03083             for( Int_t ns=0; ns<1+fStripList[n].GetLast(); ns++ ){
03084               NtpSRStrip* strip = (NtpSRStrip*)(fStripList[n].At(ns));
03085               sumevtph += strip->ph0.sigcor+strip->ph1.sigcor; 
03086             }
03087           }
03088   
03089           if( 1+fTrackStripList[n].GetLast()>0 ){
03090             for( Int_t nt=0; nt<1+fTrackStripList[n].GetLast(); nt++ ){
03091               NtpSRStrip* strip = (NtpSRStrip*)(fTrackStripList[n].At(nt));
03092               sumtrkph += strip->ph0.sigcor+strip->ph1.sigcor; 
03093             }
03094           }
03095 
03096           if( 1+fStripList[n].GetLast()>0
03097            && 1+fTrackStripList[n].GetLast()>0 ){
03098 
03099             bstrp=-1; estrp=-1;
03100             for( Int_t nt=0; nt<1+fTrackStripList[n].GetLast(); nt++ ){
03101               NtpSRStrip* strip = (NtpSRStrip*)(fTrackStripList[n].At(nt));
03102               if( bstrp<0 || strip->strip<bstrp ) bstrp=strip->strip;
03103               if( estrp<0 || strip->strip>estrp ) estrp=strip->strip;
03104             }
03105                     
03106             if(bstrp>=0 && estrp>=0 && estrp-bstrp>=0){
03107               trkph=0.0; evtph=0.0;
03108               for( Int_t ns=0; ns<1+fStripList[n].GetLast(); ns++ ){
03109                 NtpSRStrip* strip = (NtpSRStrip*)(fStripList[n].At(ns));
03110                 evtph += strip->ph0.sigcor+strip->ph1.sigcor;
03111                 if( strip->strip>=bstrp-1 && strip->strip<=estrp+1 ){
03112                   trkph += strip->ph0.sigcor+strip->ph1.sigcor;
03113                 }
03114               }
03115               if( evtph>0.0 ){
03116                 if( trkph>0.0 ) ntrackplanes += 1;
03117                 if( trkph/evtph>0.8 ) ntracklikeplanes += 1;
03118                 else nshowerlikeplanes += 1;
03119               }
03120             }
03121           }
03122         }
03123 
03124         TRKtotph = sumtrkph;
03125         TRKplanes = ntrackplanes;
03126         TRKtracklikeplanes = ntracklikeplanes;
03127         TRKshowerlikeplanes = nshowerlikeplanes;
03128 
03129       }
03130     }
03131         
03132     // RECONSTRUCTED SHOWERS
03133     // =====================
03134     Nshowers = ntpEvent->nshower;
03135 
03136     if( ntpEvent->nshower>0 ){
03137       MSG("MadAb",Msg::kDebug) << "   found reconstructed shower(s) *** " << endl;
03138 
03139       Double_t eshw = 0.0;
03140       Int_t shwcontained = 0;
03141 
03142       Int_t* shw = ntpEvent->shw;
03143       for( Int_t n=0; n<ntpEvent->nshower; n++ ){
03144         Int_t ptr=shw[n];
03145 
03146         if( ptr>=0 ){
03147           NtpSRShower* shower = (NtpSRShower*)(showerArray->At(ptr));
03148                
03149           // select hadronic showers
03150           Bool_t vtxshw = 0;       
03151           if( ( shower->vtx.z-vertex.z<0.5 )
03152            || ( shower->vtx.z-vertex.z>=0.5 
03153              && shower->shwph.wtCCgev>1.0 ) ){
03154             vtxshw = 1;
03155           }
03156 
03157           // calculate shower energy
03158           if( vtxshw ){
03159             eshw += shower->shwph.linCCgev;
03160           }
03161 
03162           // shower containment
03163           if( shwcontained==0 && shower->contained ){
03164             shwcontained = shower->contained;
03165           }
03166              
03167           // get strips in shower
03168           Int_t* shwstp = shower->stp;
03169           for( Int_t k=0; k<shower->nstrip; k++ ){
03170             Int_t sptr = shwstp[k];
03171             if( sptr>=0 ){
03172               NtpSRStrip* strip = (NtpSRStrip*)(stripArray->At(sptr));
03173               Int_t plane = strip->plane;
03174               if( plane>=0 && plane<500 ){
03175                 if( vtxshw ) fShwShowerStripList[plane].Add(strip);
03176                 else fTrkShowerStripList[plane].Add(strip);
03177               }
03178               if( sptr<last ){
03179                 shwflag[sptr] = 1;
03180               }
03181             }
03182           }
03183 
03184         }
03185       }   
03186         
03187       SHWenergy = eshw;
03188       SHWcontained = shwcontained;
03189     }
03190 
03191     Int_t sumplanes = 0;
03192     Int_t sumtrkplanes = 0;
03193     Int_t sumshwplanes = 0;
03194     Double_t sumtrktrkph = 0.0;
03195     Double_t sumtrkshwph = 0.0;
03196 
03197     for( Int_t n=0; n<last; n++ ){
03198       Int_t ptr=n;
03199       NtpSRStrip* strip = (NtpSRStrip*)(stripArray->At(ptr));
03200       Int_t plane = strip->plane;
03201       if( plane>=0 && plane<500 ){
03202 
03203         Int_t dpln = 1;
03204         if( vldc.GetDetector()==Detector::kNear ){
03205           if( plane>120 ) dpln = 5;
03206         }
03207 
03208         if( trkflag[n]==1 && shwflag[n]==0 ){
03209           sumtrktrkph += (strip->ph0.sigcor+strip->ph1.sigcor);
03210           if( flag[plane]==0 ){ 
03211             flag[plane]=1; sumtrkplanes += 1; sumplanes += dpln; 
03212           }
03213         }
03214 
03215         if( trkflag[n]==1 && shwflag[n]==1 ){
03216           sumtrkshwph += (strip->ph0.sigcor+strip->ph1.sigcor);
03217           if( flag[plane]==0 ){ 
03218             flag[plane]=1; sumshwplanes += 1; sumplanes += dpln; 
03219           }
03220         }
03221       }
03222     }
03223 
03224     // LOOK AT UNASSIGNED STRIPS
03225     // =========================
03226 
03227     // far detector
03228     if( vldc.GetDetector()==Detector::kFar ){
03229       for( Int_t n=0; n<last; n++ ){
03230         Int_t ptr=n;
03231         NtpSRStrip* strip = (NtpSRStrip*)(stripArray->At(ptr));
03232 
03233         if( strip ){
03234           Int_t plane = strip->plane;
03235           if( plane>=0 && plane<500 ){
03236 
03237             if( trkflag[n]==0 && shwflag[n]==0 ){
03238               Bool_t ontrack = 0;
03239               for( Int_t s=0; s<1+fTrackStripList[plane].GetLast(); s++ ){
03240                 NtpSRStrip* trackstrip = (NtpSRStrip*)(fTrackStripList[plane].At(s));
03241                 if( abs(trackstrip->strip-strip->strip)<=1 ) ontrack=1;
03242               }
03243               if( ontrack==0 ){
03244                 if( strip->ph0.raw+strip->ph1.raw>200.0 ){
03245                   // reco_eshw+=1.0e-4*(strip->ph0.sigcor+strip->ph1.sigcor);
03246                 }
03247               }    
03248             }
03249           }
03250         }
03251 
03252       }
03253     }
03254 
03255     // near detector
03256     if( vldc.GetDetector()==Detector::kNear ){
03257 
03258     }
03259   
03260     TRKtrkph = sumtrktrkph;
03261     TRKshwph = sumtrkshwph;
03262     TRKtrackplanes = sumtrkplanes;
03263     TRKshowerplanes = sumshwplanes;
03264     TRKspanplanes = sumplanes;
03265 
03266     // CALCULATE EVENT VARIABLES
03267     // =========================
03268 
03269     // containment
03270     if( vldc.GetDetector()==Detector::kFar ){
03271       RECOvtxR = sqrt(RECOvtxX*RECOvtxX+RECOvtxY*RECOvtxY);
03272     }
03273     if( vldc.GetDetector()==Detector::kNear ){
03274       RECOvtxR = sqrt( (RECOvtxX-1.4828)*(RECOvtxX-1.4828)
03275                      + (RECOvtxY-0.2384)*(RECOvtxY-0.2384) );
03276     }
03277     
03278     RECOcontained = ntpEvent->contained;
03279 
03280     // far detector
03281     if( vldc.GetDetector()==Detector::kFar ){
03282 
03283       Bool_t vtxcontained = 0;
03284       Bool_t endcontained = 0;
03285 
03286       Double_t evtxU = RECOvtxU;
03287       Double_t evtxV = RECOvtxV;
03288       Double_t evtxX = RECOvtxX;
03289       Double_t evtxY = RECOvtxY;       
03290       Double_t evtxZ = RECOvtxZ;
03291 
03292       dr = 999.9; 
03293       temp=4.0-evtxU; if(temp<dr) dr=temp;
03294       temp=4.0+evtxU; if(temp<dr) dr=temp;
03295       temp=4.0-evtxV; if(temp<dr) dr=temp;
03296       temp=4.0+evtxV; if(temp<dr) dr=temp;
03297       temp=4.0-evtxX; if(temp<dr) dr=temp;
03298       temp=4.0+evtxX; if(temp<dr) dr=temp;
03299       temp=4.0-evtxY; if(temp<dr) dr=temp;
03300       temp=4.0+evtxY; if(temp<dr) dr=temp;
03301       if(dr<999.9) RECOvtxDistToEdge = dr;
03302 
03303       // (assume event is going forwards)
03304       Double_t evtxdircosZ = 1.0;
03305 
03306       if( evtxdircosZ>=0.0 ){
03307         if( RECOvtxplane<249 ){ dzm = evtxZ-0.110; dzp = 14.793-evtxZ; }
03308         if( RECOvtxplane>249 ){ dzm = evtxZ-15.986; dzp = 29.955-evtxZ; }
03309       }
03310       if( evtxdircosZ<0.0 ){
03311         if( RECOvtxplane<249 ){ dzm = 14.793-evtxZ; dzp = evtxZ-0.110; }
03312         if( RECOvtxplane>249 ){ dzm = 29.955-evtxZ; dzp = evtxZ-15.986; }
03313       }
03314 
03315       RECOvtxDistToEndBack = dzm;
03316       RECOvtxDistToEndForward = dzp;
03317 
03318       // (vertex - use event vertex)
03319       vtxcontained = 0; 
03320    
03321       /*
03322       // Andy's containment cuts
03323       if( RECOvtxDistToEdge>0.2 && RECOvtxR>0.4
03324        && RECOvtxDistToEndBack>0.25 && RECOvtxDistToEndForward>1.00 ){ 
03325         vtxcontained = 1; 
03326       }
03327       */
03328 
03329 
03330       // DP - PRL containment cuts
03331       if (Ntracks>0 && TRKvtxR<sqrt(14.) 
03332           && ((TRKvtxplane>4 && TRKvtxplane<241) ||
03333               (TRKvtxplane>253 && TRKvtxplane<466))) {
03334         vtxcontained = 1; 
03335       }
03336 
03337 
03338 
03339       // (end - use end of track)
03340       endcontained = 1;
03341       if( TRKvtxplane>=0  ){
03342         endcontained = 0;
03343         if( TRKendDistToEdge>0.2 && TRKendR>0.4
03344          && TRKendDistToEndBack>0.25 && TRKendDistToEndForward>0.25 ){ 
03345           endcontained = 1; 
03346         }
03347       }
03348 
03349       RECOvtxcontained = vtxcontained;
03350       RECOendcontained = endcontained;
03351     }
03352 
03353     // near detector
03354     if( vldc.GetDetector()==Detector::kNear ){
03355       RECOvtxcontained = 0;
03356  
03357       /*
03358       // Andy's fiducial cuts
03359       if( RECOvtxZ>1.0 && RECOvtxZ<5.0 && RECOvtxR<1.0 ){
03360         RECOvtxcontained = 1;
03361       }
03362       */
03363 
03364       // DP -  PRL containment cuts
03365       if(Ntracks>0 && TRKvtxR<1.0 && TRKvtxZ>1.0 && TRKvtxZ<5.0) {
03366         RECOvtxcontained = 1; 
03367       }
03368 
03369      
03370       RECOendcontained = RECOcontained;
03371       RECOvtxDistToEdge = TRKvtxDistToEdge;
03372       RECOvtxDistToEndBack = TRKvtxDistToEndBack;
03373       RECOvtxDistToEndForward = TRKvtxDistToEndForward;
03374     }
03375 
03376     // event direction
03377     // (same as track for now)
03378     RECOdircosU = TRKvtxdircosU;
03379     RECOdircosV = TRKvtxdircosV;
03380     RECOdircosX = TRKvtxdircosX;
03381     RECOdircosY = TRKvtxdircosY;
03382     RECOdircosZ = TRKvtxdircosZ;
03383     RECOdircosneu = 0.99834*RECOdircosZ+0.05759*RECOdircosY;
03384 
03385     // event energy
03386 
03387     // DP 14/05 - use muon momentum from range if q/p=0
03388     if( RECOendcontained || TRKmomentumCurve==0){ 
03389       RECOemu = TRKmomentumRange;
03390     }
03391     else{ // use muon momentum
03392       RECOemu = TRKmomentumCurve;
03393     }
03394     RECOehad = SHWenergy;
03395 
03396     RECOenu = RECOemu+RECOehad;
03397 
03398     if( RECOenu>0.0 && RECOemu>0.0 ){
03399       Double_t Mp = 0.5*(0.93827+0.93957);
03400       RECOy = RECOehad/RECOenu; 
03401       RECOq2 = 2.0*RECOenu*RECOemu*(1.0-RECOdircosneu); 
03402       RECOw2 = Mp*Mp-RECOq2+2*Mp*RECOehad;
03403       if( RECOehad>0.0 ) RECOx = RECOq2/(2.0*Mp*RECOehad);
03404       else RECOx = 1.0;
03405 
03406       RECOQEenu = (Mp*RECOemu)/(Mp-RECOemu*(1.0-RECOdircosneu));
03407       RECOQEemu = RECOemu;
03408       if( RECOQEenu>0.0 ){
03409         RECOQEw2 = Mp*Mp;
03410         RECOQEq2 = 2.0*RECOQEenu*RECOQEemu*(1.0-RECOdircosneu);
03411         RECOQEehad = RECOQEq2/2*Mp;
03412         RECOQEy = RECOQEehad/RECOQEenu;
03413         RECOQEx = 1.0;
03414       }
03415     }
03416 
03417     delete [] shwflag;
03418     delete [] trkflag;
03419     delete [] flag;      
03420   }
03421 
03422   MSG("MadAb",Msg::kVerbose) << "  *** MadAbPid::MakeRecoVariables(...) FINISHED *** " << endl;
03423 
03424   return; 
03425 }

Generated on Thu Nov 1 11:51:22 2007 for loon by  doxygen 1.3.9.1