diff --git a/.gitignore b/.gitignore
index df7ca6d..b3c2ae8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,14 @@
+*.[oa]
+*~
+*.dat
+*.txt
*.png
*.root
__init__.py
+*.old
+pippo*
+*processDump.py
*.pyc
html/*
+LSF*
+*.list
diff --git a/EcalTiming/BuildFile.xml b/EcalTiming/BuildFile.xml
index 2734bc3..f6abf85 100644
--- a/EcalTiming/BuildFile.xml
+++ b/EcalTiming/BuildFile.xml
@@ -10,18 +10,20 @@
-
-
+
+
+
+
diff --git a/EcalTiming/doc/AlCaPhiSymStream_test.doc b/EcalTiming/doc/AlCaPhiSymStream_test.doc
index e498989..81645e8 100644
--- a/EcalTiming/doc/AlCaPhiSymStream_test.doc
+++ b/EcalTiming/doc/AlCaPhiSymStream_test.doc
@@ -5,8 +5,24 @@
Testing file:
\verbatim
file=root://eoscms//eos/cms/store/data/Run2015A/AlCaPhiSym/RAW/v1/000/246/908/00000/C0DA4527-2F0A-E511-ADFD-02163E014349.root
-cmsRun test/ecalTimeTreeMaker_FromRaw_CosmicOrBeamSplash_cfg.py files=root://eoscms/$file
+cmsRun test/ecalTime_fromAlcaStream_cfg.py files=root://eoscms/$file
\endverbatim
-The code is in debug mode that have to be switched off
+## Options for `cmsRun test/ecalTime_fromAlcaStream_cfg.py`
+Options | Default | Description
+------- | ------- | -------
+files | "" | input files (can be RAW if step contains "RECO")
+output | "" | output files. If TIME in step, it contains the calibration trees, otherwise it will be the RECO files.
+maxEvents | -1 | # of events to run over
+jsonFile |"" | path to the json file which designates which lumisections to use
+step |"RECOTIMEANALYSIS" | Do reco, time analysis or both, RECO or TIMEANALYSIS or RECOTIMEANALYSIS
+offset |0.0 | add this to each crystal time, (this was used in splash analysis, should probably be removed)
+minEnergyEB | 0.0 | add this to minimum energy threshold in EB (0.520 GeV)
+minEnergyEE | 0.0 | add this to minimum energy threshold in EE (which is a function of iRing)
+isSplash | 0 | 0=false, 1=true, performs RECO as splash data and shifts timing in analyzer by TOF difference
+streamName | "AlCaPhiSym" | type of stream, changes RECO path: AlCaPhiSym or AlCaP0
+
+
+The script `scripts/testCAF.sh` automatically can run over RAW files for specific runs, setting the options above appropriately.
+Probably should use it as a template rather than running it as is.
*/
diff --git a/EcalTiming/doc/instructions.doc b/EcalTiming/doc/instructions.doc
index 26f3444..243df8b 100644
--- a/EcalTiming/doc/instructions.doc
+++ b/EcalTiming/doc/instructions.doc
@@ -5,8 +5,10 @@ Download the code:
scram project CMSSW_7_4_2
cd CMSSW_7_4_2/src
cmsenv
-git clone git@github.com:ECALELFS/EcalTiming.git
-git clone git@github.com:ECALELFS/PhiSym.git
+git cms-merge-topic shervin86:iRingInSubdet
+git clone git@github.com:previsualconsent/EcalTiming.git
+cd EcalTiming
+checkout energystability
scram b -j16
\endverbatim
@@ -32,4 +34,4 @@ cd -
Go back to \ref index
-*/
\ No newline at end of file
+*/
diff --git a/EcalTiming/doc/splach.doc b/EcalTiming/doc/splach.doc
new file mode 100644
index 0000000..1bcb14a
--- /dev/null
+++ b/EcalTiming/doc/splach.doc
@@ -0,0 +1,14 @@
+/**
+\page Splash
+\section Splash_sec How to analyze Splash events
+
+The offset are set to make the ieta = 1 bin average to 0.
+\verbatim
+output=/path/to/output.root
+beam1file=/store/caf/user/ccecal/TPG/splash_events_run_239895_26_events_beam_1.root
+beam2file=/store/caf/user/ccecal/TPG/splash_events_run_239895_31_events_beam_2.root
+cmsRun test/ ecalTime_fromAlcaStream_cfg.py files=$beam1file output=$output offset=1.75589609219 isSplash=1
+cmsRun test/ ecalTime_fromAlcaStream_cfg.py files=$beam2file output=$output offset=-0.709605624194 isSplash=1
+\endverbatim
+
+*/
diff --git a/EcalTiming/doc/timing.doc b/EcalTiming/doc/timing.doc
index c743ad3..fccbf08 100644
--- a/EcalTiming/doc/timing.doc
+++ b/EcalTiming/doc/timing.doc
@@ -6,7 +6,7 @@
\section introduction_ Timing package
This package can be used to analyze
- - splash event data in RAW format
+ - splash event data in RAW format: \ref Splash_sec
- data from AlCaPhiSymmetry stream: \ref AlCaPhiSymmetry_test_sec
diff --git a/EcalTiming/fulldoc b/EcalTiming/fulldoc
index 621cd6b..dba9734 100644
--- a/EcalTiming/fulldoc
+++ b/EcalTiming/fulldoc
@@ -402,7 +402,7 @@ EXTRACT_ALL = NO
# be included in the documentation.
# The default value is: NO.
-EXTRACT_PRIVATE = NO
+EXTRACT_PRIVATE = YES
# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
# scope will be included in the documentation.
diff --git a/EcalTiming/interface/EcalCrystalTimingCalibration.h b/EcalTiming/interface/EcalCrystalTimingCalibration.h
index e806bc7..ec5d2cb 100644
--- a/EcalTiming/interface/EcalCrystalTimingCalibration.h
+++ b/EcalTiming/interface/EcalCrystalTimingCalibration.h
@@ -1,13 +1,22 @@
#include "EcalTiming/EcalTiming/interface/EcalTimingEvent.h"
-
#include
+#include
-/** \class EcalCrystalTimingCalibration EcalCrystalTimingCalibration.cc EcalCrystalTimingCalibration.cc
+/** \class EcalCrystalTimingCalibration EcalCrystalTimingCalibration.h EcalTiming/EcalTiming/interface/EcalCrystalTimingCalibration.h
*
* Description: add a description here
* This class contains all the timing information for a single crystal
*/
+//Defines for Dump Status (reason for dumping each crystal)
+#define DS_NONE 0x00
+#define DS_HIGH_SKEW 0x01
+#define DS_UNSTABLE_EN 0x02
+#define DS_CCU_OOT 0x04
+#define DS_RING 0x08
+#define DS_CRYS 0x10
+
+void dumpAllToTree(TTree * tree, int ix_, int iy_, int iz_, float time_, float energy_, float chiSquare_, float thrApplied_);
class EcalCrystalTimingCalibration
{
@@ -21,7 +30,12 @@ class EcalCrystalTimingCalibration
float _sum2; ///< scalar sum of the square of the time of each timingEvent
unsigned long int _num; ///< number of timingEvents;
- float _sumE;
+ float _sumE; ///< scalar sum of the energy of each timingEvent: needed for average energy
+ bool _storingEvents;
+
+ mutable std::map _sumWithinNSigma, _sum2WithinNSigma, _sum3WithinNSigma, _sumEWithinNSigma; ///< variables for calculation of mean, stdDev within n-times the origina stdDev (to remove tails)
+ mutable std::map _numWithinNSigma; ///< variables for calculation of mean, stdDev within n-times the origina stdDev (to remove tails)
+
std::vector timingEvents; ///< vector containing all the events for this crystal
std::vector::iterator maxChi2Itr;
@@ -31,7 +45,7 @@ class EcalCrystalTimingCalibration
/// default constructor
EcalCrystalTimingCalibration(bool weightMean = true) :
//_detId(),
- _sum(0), _sum2(0), _num(0), _sumE(0)
+ _sum(0), _sum2(0), _num(0), _sumE(0), _storingEvents(true)
//totalChi2(-1),
//useWeightedMean(weightMean)
{
@@ -43,6 +57,7 @@ class EcalCrystalTimingCalibration
};
inline float mean() const
{
+ if(!_num) return -999.f;
return _sum / _num;
}; ///< average time (mean of the time distribution)
inline float stdDev() const ///< standard deviation of the time distribution
@@ -65,6 +80,11 @@ class EcalCrystalTimingCalibration
/* } */
//float totalChi2;
+ float getMeanWithinNSigma(float sigma, float maxRange) const; ///< returns the mean time within abs(mean+ n * stdDev) to reject tails
+ float getStdDevWithinNSigma(float sigma, float maxRange) const; ///< returns the stdDev calculated within abs(mean+ n * stdDev) to reject tails
+ float getNumWithinNSigma(float sigma, float maxRange) const; ///< returns the num calculated within abs(mean+ n * stdDev) to reject tails
+ float getMeanErrorWithinNSigma(float sigma, float maxRange) const; ///< returns the error on the mean calculated within abs(mean+ n * stdDev) to reject tails
+ float getSkewnessWithinNSigma(float sigma, float maxRange) const; ///< returns the skewness calculated within abs(mean+ n * stdDev) to reject tails
friend std::ostream& operator<< (std::ostream& os, const EcalCrystalTimingCalibration& s)
{
@@ -73,29 +93,46 @@ class EcalCrystalTimingCalibration
}
/// add new event for this crystal
- inline bool add(EcalTimingEvent te_)
+ inline bool add(EcalTimingEvent te_, bool storeEvent = true)
{
- return insertEvent(te_);
+ return insertEvent(te_,storeEvent);
}
inline void clear()
{
- _sum = 0.0f;
- _sum2 = 0.0f;
- _num = 0;
- _sumE = 0.0f;
-
- timingEvents.clear();
+ _sum = 0.0f;
+ _sum2 = 0.0f;
+ _num = 0;
+ _sumE = 0.0f;
+ _sumWithinNSigma.clear();
+ _sum2WithinNSigma.clear();
+ _sum3WithinNSigma.clear();
+ _numWithinNSigma.clear();
+
+ timingEvents.clear();
}
+
+ void dumpToTree(TTree *tree, int ix_, int iy_, int iz_, unsigned int status_, unsigned int elecID_, int iRing_); ///< dump the full set of events in a TTree: need an empty tree
+ void dumpCalibToTree(TTree * tree, int rawid_, int ix_, int iy_, int iz_, unsigned int elecID_, int iRing_) const; ///< dump the callibratoin to the tree
+ //void dumpAllToTree(TTree * tree, int ix_, int iy_, int iz_, float time_, float energy_, float chiSquare_, float thrApplied_);
+
+ /// checks if the time measurement is stable changing the min energy threshold
+ bool isStableInEnergy(float min, float max, float step, std::vector< std::pair > &ret);
+
private:
+ void calcAllWithinNSigma(float n_sigma, float maxRange = 10) const; ///< calculate sum, sum2, sum3, n for time if time within n x stdDev and store the result
+ // since the values are stored, the calculation is done only once with only one loop over the events
+
/// \todo weighted average by timeError
- bool insertEvent(EcalTimingEvent te_)
+ bool insertEvent(EcalTimingEvent te_, bool storeEvent)
{
- if(true || te_.timeError() > 0) {
+ if(!storeEvent) _storingEvents = false;
+ if(te_.timeError() > 0 && te_.timeError() < 1000 && te_.timeError() < 3) { //exclude values with wrong timeError estimation
_sum += te_.time();
_sum2 += te_.time() * te_.time();
_sumE += te_.energy();
_num++;
- timingEvents.push_back(te_);
+ if(_storingEvents)
+ timingEvents.push_back(te_);
//updateChi2();
return true;
} else {
diff --git a/EcalTiming/interface/EcalTimeCalibrationMapFwd.h b/EcalTiming/interface/EcalTimeCalibrationMapFwd.h
new file mode 100644
index 0000000..3872910
--- /dev/null
+++ b/EcalTiming/interface/EcalTimeCalibrationMapFwd.h
@@ -0,0 +1,13 @@
+/** In this file the time Map is defined
+ */
+
+class EcalTimingEvent;
+class EcalCrystalTimingCalibration;
+
+// Map of detId and Crystal time
+typedef std::map EcalTimeCalibrationMap;
+typedef std::map EcalHWCalibrationMap;
+
+
+typedef std::map EventTimeMap;
+
diff --git a/EcalTiming/plugins/BuildFile.xml b/EcalTiming/plugins/BuildFile.xml
index c2b09bd..86def5e 100644
--- a/EcalTiming/plugins/BuildFile.xml
+++ b/EcalTiming/plugins/BuildFile.xml
@@ -5,7 +5,9 @@
+
+
diff --git a/EcalTiming/plugins/DummyRechitDigis.cc b/EcalTiming/plugins/DummyRechitDigis.cc
new file mode 100644
index 0000000..f6033a5
--- /dev/null
+++ b/EcalTiming/plugins/DummyRechitDigis.cc
@@ -0,0 +1,234 @@
+// -*- C++ -*-
+//
+// Package: ECALlite/DummyRechitDigis
+// Class: DummyRechitDigis
+//
+/**\class DummyRechitDigis DummyRechitDigis.cc ECALlite/DummyRechitDigis/plugins/DummyRechitDigis.cc
+ Description: [one line class summary]
+ Implementation:
+ [Notes on implementation]
+*/
+//
+// Original Author: Joshua Robert Hardenbrook
+// Created: Mon, 01 Jun 2015 06:58:24 GMT
+//
+//
+
+// system include files
+#include
+
+// user include files
+#include "FWCore/Framework/interface/Frameworkfwd.h"
+#include "FWCore/Framework/interface/EDProducer.h"
+#include "FWCore/Framework/interface/Event.h"
+#include "FWCore/Framework/interface/MakerMacros.h"
+#include "FWCore/ParameterSet/interface/ParameterSet.h"
+
+#include "DataFormats/EgammaReco/interface/BasicCluster.h"
+#include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
+#include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
+#include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
+#include "DataFormats/CaloRecHit/interface/CaloID.h"
+#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
+
+#include "CondFormats/EcalObjects/interface/EcalSampleMask.h"
+
+#include "EcalTiming/EcalTiming/plugins/EcalTimingCalibProducer.h"
+
+//
+// class declaration
+//
+
+class DummyRechitDigis : public edm::EDProducer {
+public:
+ explicit DummyRechitDigis(const edm::ParameterSet&);
+ ~DummyRechitDigis();
+
+ static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
+
+private:
+ virtual void beginJob() override;
+ virtual void produce(edm::Event&, const edm::EventSetup&) override;
+ virtual void endJob() override;
+
+ // ----------member data ---------------------------
+ edm::InputTag tag_barrelHitProducer_;
+ edm::InputTag tag_endcapHitProducer_;
+ const std::string barrelRecHitCollection_;
+ const std::string endcapRecHitCollection_;
+ edm::InputTag tag_barrelDigiProducer_;
+ edm::InputTag tag_endcapDigiProducer_;
+ const std::string barrelDigiCollection_;
+ const std::string endcapDigiCollection_;
+ const bool doDigi_;
+};
+
+DummyRechitDigis::DummyRechitDigis(const edm::ParameterSet& iConfig):
+ tag_barrelHitProducer_ (iConfig.getParameter< edm::InputTag > ("barrelHitProducer")),
+ tag_endcapHitProducer_ (iConfig.getParameter< edm::InputTag > ("endcapHitProducer")),
+ barrelRecHitCollection_ (iConfig.getUntrackedParameter("barrelRecHitCollection")),
+ endcapRecHitCollection_ (iConfig.getUntrackedParameter("endcapRecHitCollection")),
+ tag_barrelDigiProducer_ (iConfig.getParameter< edm::InputTag > ("barrelDigis")),
+ tag_endcapDigiProducer_ (iConfig.getParameter< edm::InputTag > ("endcapDigis")),
+ barrelDigiCollection_ (iConfig.getUntrackedParameter("barrelDigiCollection")),
+ endcapDigiCollection_ (iConfig.getUntrackedParameter("endcapDigiCollection")),
+ doDigi_ (iConfig.getUntrackedParameter("doDigi"))
+{
+ if(doDigi_) {
+ produces< EBDigiCollection >(barrelDigiCollection_);
+ produces< EEDigiCollection >(endcapDigiCollection_);
+ }
+ else {
+ produces< EcalRecHitCollection >(barrelRecHitCollection_);
+ produces< EcalRecHitCollection >(endcapRecHitCollection_);
+ }
+}
+
+DummyRechitDigis::~DummyRechitDigis(){ }
+
+void DummyRechitDigis::produce(edm::Event& iEvent, const edm::EventSetup& iSetup){
+ //std::cout << "\n-----------New Event ----------------\n " << std::endl;
+ using namespace edm;
+ // build an empty collection
+ // fake rechits
+ // handle to try to fill
+ edm::Handle barrelRecHitsHandle;
+ edm::Handle endcapRecHitsHandle;
+ // dummy collection to Put()
+ std::auto_ptr< EcalRecHitCollection > rechits_temp( new EcalRecHitCollection);
+ std::auto_ptr< EcalRecHitCollection > rechits_temp2( new EcalRecHitCollection);
+
+ // EcalRecHit::EcalRecHit(const DetId& id, float energy, float time, uint32_t flags, uint32_t flagBits)
+ // add one rechit
+ EcalRecHit zero_rechit(0,0,0,0,0);
+ EcalRecHitCollection zero_collection;
+ zero_collection.push_back(zero_rechit);
+ *rechits_temp = zero_collection;
+ *rechits_temp2 = zero_collection;
+
+ std::auto_ptr< EcalRecHitCollection > rechits_eb( new EcalRecHitCollection);
+ std::auto_ptr< EcalRecHitCollection > rechits_ee( new EcalRecHitCollection);
+
+ // fake digis
+ // handle to try to fill
+ Handle digisEBHandle;
+ Handle digisEEHandle;
+ // dummy collection to Put()
+ std::auto_ptr outputEBDigiCollection( new EBDigiCollection );
+ std::auto_ptr outputEEDigiCollection( new EEDigiCollection );
+
+ //Digi zero_digi;
+ EBDigiCollection ebfakecol;
+ EEDigiCollection eefakecol;
+ //ebfakecol.push_back(zerodigi);
+ //eefakecol.push_back(zerodigi);
+
+ // fake empty collections
+ std::auto_ptr fakeEBDigiCollection( new EBDigiCollection );
+ *fakeEBDigiCollection = ebfakecol;
+ std::auto_ptr fakeEEDigiCollection( new EEDigiCollection) ;
+ *fakeEEDigiCollection = eefakecol;
+
+ if(!doDigi_) {
+ bool foundEBRechit = true;
+ bool foundEERechit = true;
+ std::cout<<"sono entrato nel !dodigi"<begin(); recHit_itr != barrelRecHitsHandle->end(); ++recHit_itr){
+ std::cout<<"sono entrato nell'if eb"<size() > 0;}
+ // if you found the collection put it back into the event
+ iEvent.put( foundEBRechit ? rechits_eb : rechits_temp, barrelRecHitCollection_);
+
+ // if you dont find the endcap rechits youre looking for, put in a fake one
+ try {
+ //std::cout<<"sono entrato nell'if ee dodigi"<size() > 0;
+ }
+
+ iEvent.put( foundEERechit ? rechits_ee : rechits_temp2, endcapRecHitCollection_);
+ std::cout<<"Build fake digi!"<begin(); digiItr != digisEBHandle->end(); ++digiItr){
+ //EBDetId id_crystal(digiItr->id());
+ DetId id = digiItr->id();
+ //std::cout<id()<size() > 0;
+ //std::cout<<"sono entrato nel catch eb"<begin(); digiItr != digisEEHandle->end(); ++digiItr){
+ DetId id = digiItr->id();
+ // std::cout<id());
+ // std::cout<<"SUBDETID!! Endcap "<id()<id().subdetId() <<"\n";
+ }
+ *outputEEDigiCollection = *(digisEEHandle.product());
+ //std::cout<<"sono entrato nell'else ee"<size() > 0;
+ //std::cout<<"sono entrato nel catch ee"<
-#include
-#include
-
-// Make Histograms the way!!
-#include "FWCore/ServiceRegistry/interface/Service.h"
-#include "CommonTools/UtilAlgos/interface/TFileService.h"
-
-// user include files
-#include "FWCore/Framework/interface/Frameworkfwd.h"
-#include "FWCore/Framework/interface/EDConsumerBase.h"
-
-#include "FWCore/Framework/interface/EDProducer.h"
-#include "FWCore/Framework/interface/Event.h"
-//#include "FWCore/Framework/interface/Handle.h"
-#include "FWCore/Framework/interface/MakerMacros.h"
-#include "FWCore/Utilities/interface/InputTag.h"
-#include "FWCore/ParameterSet/interface/ParameterSet.h"
-
-#include "DataFormats/Common/interface/Handle.h"
-#include "FWCore/Framework/interface/LooperFactory.h"
-#include "FWCore/Framework/interface/ESProducerLooper.h"
-#include "FWCore/Framework/interface/ESHandle.h"
-#include "FWCore/Framework/interface/ESProducts.h"
-#include "FWCore/Framework/interface/Event.h"
-// input collections
-#include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
-//RingTools
-#include "Calibration/Tools/interface/EcalRingCalibrationTools.h"
-#include "Geometry/CaloGeometry/interface/CaloGeometry.h"
-#include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
-#include "Geometry/Records/interface/CaloGeometryRecord.h"
-
-// record to be produced:
-#include "CondFormats/DataRecord/interface/EcalTimeCalibConstantsRcd.h"
-#include "CondFormats/DataRecord/interface/EcalTimeCalibErrorsRcd.h"
-#include "CondFormats/DataRecord/interface/EcalTimeOffsetConstantRcd.h"
-#include "CondTools/Ecal/interface/EcalTimeCalibConstantsXMLTranslator.h"
-#include "CondTools/Ecal/interface/EcalTimeCalibErrorsXMLTranslator.h"
-#include "CondTools/Ecal/interface/EcalTimeOffsetXMLTranslator.h"
-#include "CondTools/Ecal/interface/EcalCondHeader.h"
-
-#include "CondFormats/EcalObjects/interface/EcalTimeCalibConstants.h"
-#include "CondFormats/EcalObjects/interface/EcalTimeCalibErrors.h"
-#include "CondFormats/EcalObjects/interface/EcalTimeOffsetConstant.h"
-
-#include "EcalTiming/EcalTiming/interface/EcalTimingEvent.h"
-#include "EcalTiming/EcalTiming/interface/EcalCrystalTimingCalibration.h"
-
-#include "DataFormats/EcalDetId/interface/EBDetId.h"
-#include "DataFormats/EcalDetId/interface/EEDetId.h"
-
-#include "TProfile.h"
-#include "TGraphErrors.h"
-#include "TGraph.h"
-#include "TH1F.h"
-#include "TH2F.h"
-#include "TFile.h"
-#include "TProfile2D.h"
-
-#include
-#include
-#include
-#include
-#include