Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8308724
JetCleanser.cc
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
26 KB
Subscribers
None
JetCleanser.cc
View Options
// JetCleanser Package
// Questions/Comments? dkrohn@physics.harvard.edu mattlow@uchicago.edu schwartz@physics.harvard.edu liantaow@uchicago.edu
//
// Copyright (c) 2013
// David Krohn, Matthew Low, Matthew Schwartz, and Lian-Tao Wang
//
// $Id$
//
//----------------------------------------------------------------------
// This file is part of FastJet contrib.
//
// It is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or (at
// your option) any later version.
//
// It is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
// License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this code. If not, see <http://www.gnu.org/licenses/>.
//----------------------------------------------------------------------
#include
"JetCleanser.hh"
FASTJET_BEGIN_NAMESPACE
// defined in fastjet/internal/base.hh
namespace
contrib
{
// Modification to satisfy C++11 (thanks to Gavin Salam)
const
double
JetCleanser
::
jc_zero
=
1.0e-6
;
/////////////////////////////
// constructor
JetCleanser
::
JetCleanser
(
JetDefinition
subjet_def
,
cleansing_mode
cmode
,
input_mode
imode
)
{
_subjet_def
=
subjet_def
;
_rsub
=
subjet_def
.
R
();
_cleansing_mode
=
cmode
;
_input_mode
=
imode
;
_SetDefaults
();
}
/////////////////////////////
// constructor
JetCleanser
::
JetCleanser
(
double
rsub
,
cleansing_mode
cmode
,
input_mode
imode
)
{
JetDefinition
subjet_def
(
kt_algorithm
,
rsub
);
_subjet_def
=
subjet_def
;
_rsub
=
rsub
;
_cleansing_mode
=
cmode
;
_input_mode
=
imode
;
_SetDefaults
();
}
/////////////////////////////
// _SetDefaults
void
JetCleanser
::
_SetDefaults
(){
// defaults
_fcut
=
0.0
;
_nsjmin
=
-
1
;
// "undefined" values
_linear_gamma0_mean
=
-
1
;
_gaussian_gamma0_mean
=
-
1
;
_gaussian_gamma1_mean
=
-
1
;
_gaussian_gamma0_width
=
-
1
;
_gaussian_gamma1_width
=
-
1
;
}
/////////////////////////////
// SetGroomingParameters
void
JetCleanser
::
SetGroomingParameters
(
double
fcut
,
int
nsjmin
)
{
if
(
fcut
<
0
||
fcut
>
1
)
throw
Error
(
"SetGroomingParameters(): fcut must be >= 0 and <= 1"
);
_fcut
=
fcut
;
_nsjmin
=
nsjmin
;
}
/////////////////////////////
// SetLinearParameters
void
JetCleanser
::
SetLinearParameters
(
double
g0_mean
)
{
if
(
g0_mean
<
0
||
g0_mean
>
1
)
throw
Error
(
"SetLinearParameters(): g0_mean must be >= 0 and <= 1"
);
_linear_gamma0_mean
=
g0_mean
;
}
/////////////////////////////
// SetGaussianParameters
void
JetCleanser
::
SetGaussianParameters
(
double
g0_mean
,
double
g1_mean
,
double
g0_width
,
double
g1_width
)
{
if
(
g0_mean
<
0
||
g0_mean
>
1
)
throw
Error
(
"SetGaussianParameters(): g0_mean must be >= 0 and <= 1"
);
if
(
g1_mean
<
0
||
g1_mean
>
1
)
throw
Error
(
"SetGaussianParameters(): g1_mean must be >= 0 and <= 1"
);
if
(
g0_width
<
0
||
g0_width
>
1
)
throw
Error
(
"SetGaussianParameters(): g0_width must be >= 0 and <= 1"
);
if
(
g1_width
<
0
||
g1_width
>
1
)
throw
Error
(
"SetGaussianParameters(): g1_width must be >= 0 and <= 1"
);
_gaussian_gamma0_mean
=
g0_mean
;
_gaussian_gamma1_mean
=
g1_mean
;
_gaussian_gamma0_width
=
g0_width
;
_gaussian_gamma1_width
=
g1_width
;
}
/////////////////////////////
// description
std
::
string
JetCleanser
::
description
()
const
{
std
::
ostringstream
oss
;
oss
<<
"JetCleanser ["
;
if
(
_cleansing_mode
==
jvf_cleansing
)
oss
<<
"JVF mode, "
;
else
if
(
_cleansing_mode
==
linear_cleansing
)
oss
<<
"Linear mode, "
;
else
if
(
_cleansing_mode
==
gaussian_cleansing
)
oss
<<
"Gaussian mode, "
;
if
(
_input_mode
==
input_nc_together
)
oss
<<
"input = neutral and charged together]"
<<
std
::
endl
;
else
if
(
_input_mode
==
input_nc_separate
)
oss
<<
"input = neutral and charged separate]"
<<
std
::
endl
;
if
(
_nsjmin
<=
0
)
oss
<<
" Trimming: fcut = "
<<
_fcut
<<
std
::
endl
;
else
if
(
_fcut
>=
1.0
)
oss
<<
" Filtering: nsj = "
<<
_nsjmin
<<
std
::
endl
;
else
oss
<<
" Trimming + Filtering: fcut = "
<<
_fcut
<<
", nsj = "
<<
_nsjmin
<<
std
::
endl
;
if
(
_cleansing_mode
==
linear_cleansing
)
oss
<<
" g0_mean = "
<<
_linear_gamma0_mean
<<
std
::
endl
;
else
if
(
_cleansing_mode
==
gaussian_cleansing
)
oss
<<
" g0_mean = "
<<
_gaussian_gamma0_mean
<<
", g0_width = "
<<
_gaussian_gamma0_width
<<
", g1_mean = "
<<
_gaussian_gamma1_mean
<<
", g1_width = "
<<
_gaussian_gamma1_width
<<
std
::
endl
;
return
oss
.
str
();
}
/////////////////////////////
// cleanse
PseudoJet
JetCleanser
::
operator
()(
const
PseudoJet
&
jet
,
const
std
::
vector
<
PseudoJet
>
&
tracks_lv
,
const
std
::
vector
<
PseudoJet
>
&
tracks_pu
)
const
{
if
(
_input_mode
!=
input_nc_together
)
throw
Error
(
"result(): This operator is only defined for input_nc_together mode"
);
// get constituents
if
(
!
(
jet
.
has_constituents
())
)
return
PseudoJet
();
std
::
vector
<
PseudoJet
>
constituents_all
=
jet
.
constituents
();
// prepare for clustering
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
follow_sets
;
follow_sets
.
push_back
(
constituents_all
);
follow_sets
.
push_back
(
tracks_lv
);
follow_sets
.
push_back
(
tracks_pu
);
// get subjets
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
sets
=
ClusterSets
(
_subjet_def
,
constituents_all
,
follow_sets
);
std
::
vector
<
PseudoJet
>
subjets_all
,
subjets_tracks_lv
,
subjets_tracks_pu
;
subjets_all
=
sets
[
0
];
subjets_tracks_lv
=
sets
[
1
];
subjets_tracks_pu
=
sets
[
2
];
// rescale subjets
std
::
vector
<
PseudoJet
>
rescaled_subjets_all
;
for
(
unsigned
i
=
0
;
i
<
subjets_all
.
size
();
i
++
){
double
s_factor
=
_GetSubjetRescaling_nctogether
(
subjets_all
[
i
].
pt
(),
subjets_tracks_lv
[
i
].
pt
(),
subjets_tracks_pu
[
i
].
pt
());
PseudoJet
rescaled_subjet_all
=
RescalePseudoJetConstituents
(
subjets_all
[
i
],
s_factor
);
if
(
rescaled_subjet_all
!=
0.0
)
rescaled_subjets_all
.
push_back
(
rescaled_subjet_all
);
}
// trim/filter subjets
rescaled_subjets_all
=
sorted_by_pt
(
rescaled_subjets_all
);
std
::
vector
<
PseudoJet
>
trimmed_subjets_all
;
for
(
unsigned
i
=
0
;
i
<
rescaled_subjets_all
.
size
();
i
++
){
bool
pass_filtering
=
_nsjmin
>
0
?
i
<
_nsjmin
:
false
;
bool
pass_trimming
=
rescaled_subjets_all
[
i
].
pt
()
>
_fcut
*
jet
.
pt
();
if
(
pass_trimming
||
pass_filtering
)
{
trimmed_subjets_all
.
push_back
(
rescaled_subjets_all
[
i
]
);
}
}
return
join
(
trimmed_subjets_all
);
}
/////////////////////////////
// cleanse
PseudoJet
JetCleanser
::
operator
()(
const
std
::
vector
<
PseudoJet
>
&
neutrals_all
,
const
std
::
vector
<
PseudoJet
>
&
tracks_lv
,
const
std
::
vector
<
PseudoJet
>
&
tracks_pu
)
const
{
if
(
_input_mode
!=
input_nc_separate
)
throw
Error
(
"result(): This operator is only defined for input_nc_separate mode"
);
// assemble jet collections
std
::
vector
<
PseudoJet
>
particles_all
;
for
(
unsigned
i
=
0
;
i
<
neutrals_all
.
size
();
i
++
){
particles_all
.
push_back
(
neutrals_all
[
i
]);
}
for
(
unsigned
i
=
0
;
i
<
tracks_lv
.
size
();
i
++
){
particles_all
.
push_back
(
tracks_lv
[
i
]);
}
for
(
unsigned
i
=
0
;
i
<
tracks_pu
.
size
();
i
++
){
particles_all
.
push_back
(
tracks_pu
[
i
]);
}
PseudoJet
jet
=
join
(
particles_all
);
// prepare for clustering
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
follow_sets
;
follow_sets
.
push_back
(
particles_all
);
follow_sets
.
push_back
(
neutrals_all
);
follow_sets
.
push_back
(
tracks_lv
);
follow_sets
.
push_back
(
tracks_pu
);
// get subjets
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
sets
=
ClusterSets
(
_subjet_def
,
particles_all
,
follow_sets
);
std
::
vector
<
PseudoJet
>
subjets_all
,
subjets_neutrals_all
,
subjets_tracks_lv
,
subjets_tracks_pu
;
subjets_all
=
sets
[
0
];
subjets_neutrals_all
=
sets
[
1
];
subjets_tracks_lv
=
sets
[
2
];
subjets_tracks_pu
=
sets
[
3
];
// rescale neutral subjets and add to charged LV subjets
std
::
vector
<
PseudoJet
>
rescaled_subjets_all
;
for
(
unsigned
i
=
0
;
i
<
subjets_all
.
size
();
i
++
){
double
s_factor
=
_GetSubjetRescaling_ncseparate
(
subjets_neutrals_all
[
i
].
pt
(),
subjets_tracks_lv
[
i
].
pt
(),
subjets_tracks_pu
[
i
].
pt
());
PseudoJet
rescaled_subjet_ntrl
=
RescalePseudoJetConstituents
(
subjets_neutrals_all
[
i
],
s_factor
);
PseudoJet
rescaled_subjet_all
=
join
(
rescaled_subjet_ntrl
,
subjets_tracks_lv
[
i
]
);
if
(
rescaled_subjet_all
!=
0.0
)
rescaled_subjets_all
.
push_back
(
rescaled_subjet_all
);
}
// trim/filter subjets
rescaled_subjets_all
=
sorted_by_pt
(
rescaled_subjets_all
);
std
::
vector
<
PseudoJet
>
trimmed_subjets_all
;
for
(
unsigned
i
=
0
;
i
<
rescaled_subjets_all
.
size
();
i
++
){
bool
pass_filtering
=
_nsjmin
>
0
?
i
<
_nsjmin
:
false
;
bool
pass_trimming
=
rescaled_subjets_all
[
i
].
pt
()
>
_fcut
*
jet
.
pt
();
if
(
pass_trimming
||
pass_filtering
)
{
trimmed_subjets_all
.
push_back
(
rescaled_subjets_all
[
i
]
);
}
}
return
join
(
trimmed_subjets_all
);
}
/////////////////////////////
// helper: _CheckRescalingValues
// allow some leeway for detector effects
void
JetCleanser
::
_CheckRescalingValues
(
double
&
pt_all
,
const
double
&
ptc_lv
,
const
double
&
ptc_pu
)
const
{
double
ratio
=
(
ptc_lv
+
ptc_pu
)
/
pt_all
;
if
(
ratio
>
1.05
)
throw
Error
(
"_CheckRescalingValues: ptc_lv + ptc_pu is more than 5\% larger than pt_all"
);
else
if
(
ratio
>
1.0
){
pt_all
=
pt_all
*
ratio
;
}
}
/////////////////////////////
// helper: _GetSubjetRescaling_nctogether
double
JetCleanser
::
_GetSubjetRescaling_nctogether
(
double
pt_all
,
double
ptc_lv
,
double
ptc_pu
)
const
{
double
scale
;
// jvf mode
if
(
_cleansing_mode
==
jvf_cleansing
)
{
scale
=
ptc_lv
>
jc_zero
?
ptc_lv
/
(
ptc_lv
+
ptc_pu
)
:
0.0
;
}
// linear mode
else
if
(
_cleansing_mode
==
linear_cleansing
)
{
if
(
_linear_gamma0_mean
<
0
)
throw
Error
(
"Linear cleansing parameters have not been set yet."
);
_CheckRescalingValues
(
pt_all
,
ptc_lv
,
ptc_pu
);
if
(
ptc_pu
>
jc_zero
&&
ptc_pu
/
(
pt_all
-
ptc_lv
)
>
_linear_gamma0_mean
)
scale
=
ptc_lv
>
jc_zero
?
ptc_lv
/
(
ptc_lv
+
ptc_pu
)
:
0.0
;
else
scale
=
ptc_lv
>
jc_zero
?
1.0
-
(
1.0
/
_linear_gamma0_mean
)
*
ptc_pu
/
pt_all
:
0.0
;
//double linear_gamma1 = ptc_lv >= jc_zero ? ptc_lv / ( pt_all - (1.0/_linear_gamma0_mean)*ptc_pu ) : 0.0;
}
// gaussian mode
else
if
(
_cleansing_mode
==
gaussian_cleansing
)
{
if
(
_gaussian_gamma0_mean
<
0
||
_gaussian_gamma1_mean
<
0
||
_gaussian_gamma0_width
<
0
||
_gaussian_gamma1_width
<
0
)
throw
Error
(
"Gaussian cleansing parameters have not been set yet."
);
_CheckRescalingValues
(
pt_all
,
ptc_lv
,
ptc_pu
);
double
_gaussian_gamma0
=
_GaussianGetMinimizedGamma0
(
pt_all
,
ptc_lv
,
ptc_pu
);
//double _gaussian_gamma1 = _GaussianGetGamma1(_gaussian_gamma0, pt_all, ptc_lv, ptc_pu);
scale
=
ptc_lv
>
jc_zero
?
1.0
-
(
1.0
/
_gaussian_gamma0
)
*
ptc_pu
/
pt_all
:
0.0
;
}
else
throw
Error
(
"_GetSubjetRescaling: Current cleansing mode is not recognized."
);
return
scale
>
jc_zero
?
scale
:
0.0
;
}
/////////////////////////////
// helper: _GetSubjetRescaling_ncseparate
double
JetCleanser
::
_GetSubjetRescaling_ncseparate
(
double
ptn_all
,
double
ptc_lv
,
double
ptc_pu
)
const
{
double
scale
;
// jvf mode
if
(
_cleansing_mode
==
jvf_cleansing
)
{
scale
=
ptc_lv
>
jc_zero
&&
ptn_all
>
jc_zero
?
ptc_lv
/
(
ptc_lv
+
ptc_pu
)
:
0.0
;
}
// linear mode
else
if
(
_cleansing_mode
==
linear_cleansing
)
{
if
(
_linear_gamma0_mean
<
0
)
throw
Error
(
"Linear cleansing parameters have not been set yet."
);
double
pt_all
=
ptn_all
+
ptc_lv
+
ptc_pu
;
_CheckRescalingValues
(
pt_all
,
ptc_lv
,
ptc_pu
);
if
(
(
ptc_pu
>
jc_zero
&&
ptc_pu
/
(
pt_all
-
ptc_lv
)
>
_linear_gamma0_mean
)
||
ptn_all
<
jc_zero
)
scale
=
ptc_lv
>
jc_zero
&&
ptn_all
>
jc_zero
?
ptc_lv
/
(
ptc_lv
+
ptc_pu
)
:
0.0
;
else
scale
=
ptc_lv
>
jc_zero
&&
ptn_all
>
jc_zero
?
1.0
-
(
1.0
/
_linear_gamma0_mean
-
1.0
)
*
ptc_pu
/
ptn_all
:
0.0
;
//double linear_gamma1 = ptc_lv > jc_zero ? ptc_lv / ( pt_all - (1.0/_linear_gamma0_mean)*ptc_pu ) : 0.0;
}
// gaussian mode
else
if
(
_cleansing_mode
==
gaussian_cleansing
)
{
if
(
_gaussian_gamma0_mean
<
0
||
_gaussian_gamma1_mean
<
0
||
_gaussian_gamma0_width
<
0
||
_gaussian_gamma1_width
<
0
)
throw
Error
(
"Gaussian cleansing parameters have not been set yet."
);
double
pt_all
=
ptn_all
+
ptc_lv
+
ptc_pu
;
_CheckRescalingValues
(
pt_all
,
ptc_lv
,
ptc_pu
);
double
_gaussian_gamma0
=
_GaussianGetMinimizedGamma0
(
pt_all
,
ptc_lv
,
ptc_pu
);
//double _gaussian_gamma1 = _GaussianGetGamma1(_gaussian_gamma0, pt_all, ptc_lv, ptc_pu);
scale
=
ptc_lv
>
jc_zero
&&
ptn_all
>
jc_zero
?
1.0
-
(
1.0
/
_gaussian_gamma0
-
1.0
)
*
ptc_pu
/
ptn_all
:
0.0
;
}
else
throw
Error
(
"_GetSubjetRescaling: Current cleansing mode is not recognized."
);
return
scale
>
jc_zero
?
scale
:
0.0
;
}
/////////////////////////////
// helper: _GaussianGetMinimizedGamma0
double
JetCleanser
::
_GaussianGetMinimizedGamma0
(
double
pt_all
,
double
ptc_lv
,
double
ptc_pu
)
const
{
if
(
pt_all
==
0.0
&&
ptc_lv
==
0.0
&&
ptc_pu
==
0.0
)
return
0.0
;
if
(
ptc_lv
==
0.0
)
return
ptc_pu
/
pt_all
;
double
params
[
3
]
=
{
ptc_lv
,
ptc_pu
,
pt_all
};
std
::
map
<
double
,
double
>
map_fcn_to_x
;
for
(
double
x0
=
0.0
;
x0
<=
1.0
+
jc_zero
;
x0
+=
0.01
)
{
map_fcn_to_x
[
_GaussianFunction
(
x0
,
params
)]
=
x0
;
}
return
map_fcn_to_x
.
begin
()
->
second
;
}
/////////////////////////////
// helper: _GaussianGetGamma1
double
JetCleanser
::
_GaussianGetGamma1
(
double
gamma0
,
double
pt_all
,
double
ptc_lv
,
double
ptc_pu
)
const
{
if
(
pt_all
==
0.0
&&
ptc_lv
==
0.0
&&
ptc_pu
==
0.0
)
return
0.0
;
if
(
gamma0
==
0.0
||
fabs
(
pt_all
-
ptc_pu
/
gamma0
)
<
jc_zero
)
return
0.0
;
return
ptc_lv
/
(
pt_all
-
ptc_pu
/
gamma0
);
}
/////////////////////////////
// helper: _GaussianFunction
double
JetCleanser
::
_GaussianFunction
(
double
x
,
void
*
params
)
const
{
double
ptc_lv
=
((
double
*
)
params
)[
0
];
double
ptc_pu
=
((
double
*
)
params
)[
1
];
double
pt_all
=
((
double
*
)
params
)[
2
];
double
g1
=
_GaussianGetGamma1
(
x
,
pt_all
,
ptc_lv
,
ptc_pu
);
if
(
g1
>=
1.
||
g1
<=
0.
||
x
<=
0.
||
x
>=
1.
)
return
(
x
-
1.
)
*
(
x
-
1.
)
+
10.
;
return
-
exp
(
-
(
g1
-
_gaussian_gamma1_mean
)
*
(
g1
-
_gaussian_gamma1_mean
)
/
2.
/
_gaussian_gamma1_width
/
_gaussian_gamma1_width
-
(
x
-
_gaussian_gamma0_mean
)
*
(
x
-
_gaussian_gamma0_mean
)
/
2.
/
_gaussian_gamma0_width
/
_gaussian_gamma0_width
);
}
/////////////////////////////
// helper: ClusterSets
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
ClusterSets
(
const
JetDefinition
&
jet_def
,
const
std
::
vector
<
PseudoJet
>
&
cluster_set
,
const
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
&
follow_sets
,
const
double
&
ptmin
)
{
// start set
std
::
vector
<
PseudoJet
>
full_set
;
for
(
unsigned
i
=
0
;
i
<
cluster_set
.
size
();
i
++
){
full_set
.
push_back
(
cluster_set
[
i
]
);
}
// convert to ghosts and add
for
(
unsigned
i
=
0
;
i
<
follow_sets
.
size
();
i
++
){
std
::
vector
<
PseudoJet
>
current_set
=
follow_sets
[
i
];
for
(
unsigned
j
=
0
;
j
<
current_set
.
size
();
j
++
){
FollowSetGhostInfo
*
ghost_info
=
new
FollowSetGhostInfo
(
i
,
j
);
PseudoJet
ghost_pseudojet
=
1.0e-60
*
current_set
[
j
];
ghost_pseudojet
.
set_user_info
(
ghost_info
);
full_set
.
push_back
(
ghost_pseudojet
);
}
}
// cluster
ClusterSequence
*
cs
=
new
ClusterSequence
(
full_set
,
jet_def
);
std
::
vector
<
PseudoJet
>
jets
=
sorted_by_pt
(
cs
->
inclusive_jets
(
ptmin
)
);
cs
->
delete_self_when_unused
();
// construct sets
std
::
vector
<
std
::
vector
<
PseudoJet
>
>
follow_jets
;
for
(
unsigned
i
=
0
;
i
<
follow_sets
.
size
();
i
++
){
std
::
vector
<
PseudoJet
>
current_set
;
for
(
unsigned
j
=
0
;
j
<
jets
.
size
();
j
++
){
current_set
.
push_back
(
join
(
PseudoJet
()
)
);
}
follow_jets
.
push_back
(
current_set
);
}
// construct jet sets
for
(
unsigned
i
=
0
;
i
<
jets
.
size
();
i
++
){
std
::
vector
<
PseudoJet
>
constituents
=
jets
[
i
].
constituents
();
for
(
unsigned
j
=
0
;
j
<
constituents
.
size
();
j
++
){
if
(
constituents
[
j
].
has_user_info
<
FollowSetGhostInfo
>
()
){
FollowSetGhostInfo
ghost_info
=
constituents
[
j
].
user_info
<
FollowSetGhostInfo
>
();
int
set_id
=
ghost_info
.
GetSetId
();
int
ind_id
=
ghost_info
.
GetIndId
();
std
::
vector
<
PseudoJet
>
current_set
=
follow_sets
[
set_id
];
if
(
follow_jets
[
set_id
][
i
]
==
0.0
)
follow_jets
[
set_id
][
i
]
=
join
(
current_set
[
ind_id
]
);
else
follow_jets
[
set_id
][
i
]
=
join
(
follow_jets
[
set_id
][
i
],
current_set
[
ind_id
]
);
}
}
}
return
follow_jets
;
}
/////////////////////////////
// helper: RescalePseudoJetVector
std
::
vector
<
PseudoJet
>
RescalePseudoJetVector
(
const
std
::
vector
<
PseudoJet
>
&
jets
,
const
double
s_factor
)
{
std
::
vector
<
PseudoJet
>
rescaled_jets
;
if
(
s_factor
==
0.0
)
return
rescaled_jets
;
for
(
unsigned
i
=
0
;
i
<
jets
.
size
();
i
++
){
rescaled_jets
.
push_back
(
s_factor
*
jets
[
i
]
);
}
//for (unsigned i=0; i<jets.size(); i++){ rescaled_jets.push_back( PseudoJet(s_factor*jets[i].px(),
// s_factor*jets[i].py(),
// s_factor*jets[i].pz(),
// s_factor*jets[i].e()) ); }
return
rescaled_jets
;
}
/////////////////////////////
// helper: RescalePseudoJetConstituents
PseudoJet
RescalePseudoJetConstituents
(
const
PseudoJet
&
jet
,
const
double
s_factor
)
{
if
(
!
(
jet
.
has_constituents
())
)
return
PseudoJet
();
std
::
vector
<
PseudoJet
>
constituents
=
jet
.
constituents
();
std
::
vector
<
PseudoJet
>
rconstituents
=
RescalePseudoJetVector
(
constituents
,
s_factor
);
return
join
(
rconstituents
);
}
/////////////////////////////
// helper: _RunTests
void
JetCleanser
::
_RunTests
()
{
std
::
cout
<<
"----- Testing contrib::JetCleanser -----"
<<
std
::
endl
;
std
::
cout
<<
"Warning: All cleansing settings will be changed during the test."
<<
std
::
endl
;
// INPUT MODE = input_nc_together
_input_mode
=
input_nc_together
;
_cleansing_mode
=
jvf_cleansing
;
std
::
cout
<<
"Mode = [nc_together,jvf]"
<<
std
::
endl
;
_RunTestRescaling
(
1.0
,
0.0
,
-
0.5
);
_RunTestRescaling
(
1.0
,
0.0
,
-
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.0
);
_RunTestRescaling
(
1.0
,
0.0
,
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.50
);
_RunTestRescaling
(
1.0
,
0.0
,
0.99
);
_RunTestRescaling
(
1.0
,
0.0
,
1.0
);
_RunTestRescaling
(
1.0
,
0.0
,
1.01
);
_RunTestRescaling
(
1.0
,
0.0
,
1.5
);
_RunTestRescaling
(
1.0
,
0.01
,
1.0
);
_RunTestRescaling
(
1.0
,
0.5
,
0.3
);
_RunTestRescaling
(
1.0
,
0.5
,
0.49
);
_RunTestRescaling
(
1.0
,
0.5
,
0.5
);
_RunTestRescaling
(
1.0
,
0.5
,
0.51
);
_RunTestRescaling
(
1.0
,
0.5
,
0.7
);
_RunTestRescaling
(
1.0
,
0.5
,
1.0
);
_RunTestRescaling
(
1.0
,
-
0.5
,
0.0
);
_RunTestRescaling
(
1.0
,
-
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.50
,
0.0
);
_RunTestRescaling
(
1.0
,
0.99
,
0.0
);
_RunTestRescaling
(
1.0
,
1.0
,
0.0
);
_RunTestRescaling
(
1.0
,
1.01
,
0.0
);
_RunTestRescaling
(
1.0
,
1.5
,
0.0
);
_cleansing_mode
=
linear_cleansing
;
_linear_gamma0_mean
=
0.67
;
std
::
cout
<<
std
::
endl
<<
"Mode = [nc_together,linear]"
<<
std
::
endl
;
_RunTestRescaling
(
1.0
,
0.0
,
-
0.5
);
_RunTestRescaling
(
1.0
,
0.0
,
-
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.0
);
_RunTestRescaling
(
1.0
,
0.0
,
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.50
);
_RunTestRescaling
(
1.0
,
0.0
,
0.99
);
_RunTestRescaling
(
1.0
,
0.0
,
1.0
);
_RunTestRescaling
(
1.0
,
0.0
,
1.01
);
_RunTestRescaling
(
1.0
,
0.0
,
1.5
);
_RunTestRescaling
(
1.0
,
0.01
,
1.0
);
_RunTestRescaling
(
1.0
,
0.5
,
0.3
);
_RunTestRescaling
(
1.0
,
0.5
,
0.49
);
_RunTestRescaling
(
1.0
,
0.5
,
0.5
);
_RunTestRescaling
(
1.0
,
0.5
,
0.51
);
_RunTestRescaling
(
1.0
,
0.5
,
0.7
);
_RunTestRescaling
(
1.0
,
0.5
,
1.0
);
_RunTestRescaling
(
1.0
,
-
0.5
,
0.0
);
_RunTestRescaling
(
1.0
,
-
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.50
,
0.0
);
_RunTestRescaling
(
1.0
,
0.99
,
0.0
);
_RunTestRescaling
(
1.0
,
1.0
,
0.0
);
_RunTestRescaling
(
1.0
,
1.01
,
0.0
);
_RunTestRescaling
(
1.0
,
1.5
,
0.0
);
_cleansing_mode
=
gaussian_cleansing
;
_gaussian_gamma0_mean
=
0.67
;
_gaussian_gamma0_width
=
0.15
;
_gaussian_gamma1_mean
=
0.67
;
_gaussian_gamma1_width
=
0.25
;
std
::
cout
<<
std
::
endl
<<
"Mode = [nc_together,gaussian]"
<<
std
::
endl
;
_RunTestRescaling
(
1.0
,
0.0
,
-
0.5
);
_RunTestRescaling
(
1.0
,
0.0
,
-
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.0
);
_RunTestRescaling
(
1.0
,
0.0
,
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.50
);
_RunTestRescaling
(
1.0
,
0.0
,
0.99
);
_RunTestRescaling
(
1.0
,
0.0
,
1.0
);
_RunTestRescaling
(
1.0
,
0.0
,
1.01
);
_RunTestRescaling
(
1.0
,
0.0
,
1.5
);
_RunTestRescaling
(
1.0
,
0.01
,
1.0
);
_RunTestRescaling
(
1.0
,
0.5
,
0.3
);
_RunTestRescaling
(
1.0
,
0.5
,
0.49
);
_RunTestRescaling
(
1.0
,
0.5
,
0.5
);
_RunTestRescaling
(
1.0
,
0.5
,
0.51
);
_RunTestRescaling
(
1.0
,
0.5
,
0.7
);
_RunTestRescaling
(
1.0
,
0.5
,
1.0
);
_RunTestRescaling
(
1.0
,
-
0.5
,
0.0
);
_RunTestRescaling
(
1.0
,
-
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.50
,
0.0
);
_RunTestRescaling
(
1.0
,
0.99
,
0.0
);
_RunTestRescaling
(
1.0
,
1.0
,
0.0
);
_RunTestRescaling
(
1.0
,
1.01
,
0.0
);
_RunTestRescaling
(
1.0
,
1.5
,
0.0
);
// INPUT MODE = input_nc_together
_input_mode
=
input_nc_separate
;
_cleansing_mode
=
jvf_cleansing
;
std
::
cout
<<
std
::
endl
<<
"Mode = [nc_separate,jvf]"
<<
std
::
endl
;
_RunTestRescaling
(
1.0
,
0.0
,
-
0.5
);
_RunTestRescaling
(
1.0
,
0.0
,
-
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.0
);
_RunTestRescaling
(
1.0
,
0.0
,
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.50
);
_RunTestRescaling
(
1.0
,
0.0
,
0.99
);
_RunTestRescaling
(
1.0
,
0.0
,
1.0
);
_RunTestRescaling
(
1.0
,
0.0
,
1.01
);
_RunTestRescaling
(
1.0
,
0.0
,
1.5
);
_RunTestRescaling
(
1.0
,
0.01
,
1.0
);
_RunTestRescaling
(
1.0
,
0.5
,
0.3
);
_RunTestRescaling
(
1.0
,
0.5
,
0.49
);
_RunTestRescaling
(
1.0
,
0.5
,
0.5
);
_RunTestRescaling
(
1.0
,
0.5
,
0.51
);
_RunTestRescaling
(
1.0
,
0.5
,
0.7
);
_RunTestRescaling
(
1.0
,
0.5
,
1.0
);
_RunTestRescaling
(
1.0
,
-
0.5
,
0.0
);
_RunTestRescaling
(
1.0
,
-
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.50
,
0.0
);
_RunTestRescaling
(
1.0
,
0.99
,
0.0
);
_RunTestRescaling
(
1.0
,
1.0
,
0.0
);
_RunTestRescaling
(
1.0
,
1.01
,
0.0
);
_RunTestRescaling
(
1.0
,
1.5
,
0.0
);
_input_mode
=
input_nc_separate
;
_cleansing_mode
=
linear_cleansing
;
_linear_gamma0_mean
=
0.67
;
std
::
cout
<<
std
::
endl
<<
"Mode = [nc_separate,linear]"
<<
std
::
endl
;
_RunTestRescaling
(
1.0
,
0.0
,
-
0.5
);
_RunTestRescaling
(
1.0
,
0.0
,
-
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.0
);
_RunTestRescaling
(
1.0
,
0.0
,
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.50
);
_RunTestRescaling
(
1.0
,
0.0
,
0.99
);
_RunTestRescaling
(
1.0
,
0.0
,
1.0
);
_RunTestRescaling
(
1.0
,
0.0
,
1.01
);
_RunTestRescaling
(
1.0
,
0.0
,
1.5
);
_RunTestRescaling
(
1.0
,
0.01
,
1.0
);
_RunTestRescaling
(
1.0
,
0.5
,
0.3
);
_RunTestRescaling
(
1.0
,
0.5
,
0.49
);
_RunTestRescaling
(
1.0
,
0.5
,
0.5
);
_RunTestRescaling
(
1.0
,
0.5
,
0.51
);
_RunTestRescaling
(
1.0
,
0.5
,
0.7
);
_RunTestRescaling
(
1.0
,
0.5
,
1.0
);
_RunTestRescaling
(
1.0
,
-
0.5
,
0.0
);
_RunTestRescaling
(
1.0
,
-
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.50
,
0.0
);
_RunTestRescaling
(
1.0
,
0.99
,
0.0
);
_RunTestRescaling
(
1.0
,
1.0
,
0.0
);
_RunTestRescaling
(
1.0
,
1.01
,
0.0
);
_RunTestRescaling
(
1.0
,
1.5
,
0.0
);
_cleansing_mode
=
gaussian_cleansing
;
_gaussian_gamma0_mean
=
0.67
;
_gaussian_gamma0_width
=
0.15
;
_gaussian_gamma1_mean
=
0.67
;
_gaussian_gamma1_width
=
0.25
;
std
::
cout
<<
std
::
endl
<<
"Mode = [nc_separate,gaussian]"
<<
std
::
endl
;
_RunTestRescaling
(
1.0
,
0.0
,
-
0.5
);
_RunTestRescaling
(
1.0
,
0.0
,
-
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.0
);
_RunTestRescaling
(
1.0
,
0.0
,
0.01
);
_RunTestRescaling
(
1.0
,
0.0
,
0.50
);
_RunTestRescaling
(
1.0
,
0.0
,
0.99
);
_RunTestRescaling
(
1.0
,
0.0
,
1.0
);
_RunTestRescaling
(
1.0
,
0.0
,
1.01
);
_RunTestRescaling
(
1.0
,
0.0
,
1.5
);
_RunTestRescaling
(
1.0
,
0.01
,
1.0
);
_RunTestRescaling
(
1.0
,
0.5
,
0.3
);
_RunTestRescaling
(
1.0
,
0.5
,
0.49
);
_RunTestRescaling
(
1.0
,
0.5
,
0.5
);
_RunTestRescaling
(
1.0
,
0.5
,
0.51
);
_RunTestRescaling
(
1.0
,
0.5
,
0.7
);
_RunTestRescaling
(
1.0
,
0.5
,
1.0
);
_RunTestRescaling
(
1.0
,
-
0.5
,
0.0
);
_RunTestRescaling
(
1.0
,
-
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.01
,
0.0
);
_RunTestRescaling
(
1.0
,
0.50
,
0.0
);
_RunTestRescaling
(
1.0
,
0.99
,
0.0
);
_RunTestRescaling
(
1.0
,
1.0
,
0.0
);
_RunTestRescaling
(
1.0
,
1.01
,
0.0
);
_RunTestRescaling
(
1.0
,
1.5
,
0.0
);
}
/////////////////////////////
// helper: _RunTestRescaling
void
JetCleanser
::
_RunTestRescaling
(
double
pt_all
,
double
ptc_lv
,
double
ptc_pu
)
const
{
double
s_factor
,
ptn_all
=
0
;
if
(
_input_mode
==
input_nc_separate
)
ptn_all
=
pt_all
-
ptc_lv
-
ptc_pu
;
try
{
s_factor
=
_input_mode
==
input_nc_together
?
_GetSubjetRescaling_nctogether
(
pt_all
,
ptc_lv
,
ptc_pu
)
:
_GetSubjetRescaling_ncseparate
(
ptn_all
,
ptc_lv
,
ptc_pu
);
}
catch
(
Error
e
)
{
s_factor
=
-
1.0
;
}
std
::
cout
<<
" pt_all = "
<<
pt_all
<<
" ptc_lv = "
<<
ptc_lv
<<
" ptc_pu = "
<<
ptc_pu
;
if
(
_input_mode
==
input_nc_separate
)
std
::
cout
<<
" ptn_all = "
<<
ptn_all
;
if
(
s_factor
<
0.0
)
{
std
::
cout
<<
" scale = error"
<<
std
::
endl
;
}
else
std
::
cout
<<
" scale = "
<<
s_factor
<<
std
::
endl
;
}
}
// namespace contrib
FASTJET_END_NAMESPACE
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Sat, Dec 21, 12:58 PM (1 d, 7 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4020875
Default Alt Text
JetCleanser.cc (26 KB)
Attached To
rFASTJETSVN fastjetsvn
Event Timeline
Log In to Comment